neubot_asyncio/transports.py: add SSL transport

To do this, move the common code into a mixin used to implement both
the TCP and the SSL transport.

Generally speaking, the SSL transport uses the same algorithm that is
already used by, e.g., neubot/sslstream.py.

While there, fix a bug in the send path of the TCP transport code,
now moved in the mixin transport, by which a "Programmer error" runtime
error was always triggered.

I also needed to add to the transport mixin code another state variable
and two functions to control the write state from the SSL transport.