async fn negotiate_protocol_version<S: AsyncReadExt + AsyncWriteExt + Unpin>(
    stream: S,
    our_protocol_range: ProtocolsRange
) -> Result<(S, Protocol), ProtocolNegotiationError>