async fn manage_connection<PK: PublicKey, D: Data, S: AsyncWrite + Unpin + Send, R: AsyncRead + Unpin + Send>(
    sender: S,
    receiver: R,
    data_from_user: UnboundedReceiver<D>,
    data_for_user: UnboundedSender<D>
) -> Result<(), ProtocolError<PK>>