Introduce stackable IO streams

We currently have gitno for talking over TCP, but this needs to know
about both plaintext and OpenSSL connections and the code has gotten
somewhat messy with ifdefs determining which version of the function
should be called.

In order to clean this up and abstract away the details of sending over
the different types of streams, we can instead use an interface and
stack stream implementations.

We may not be able to use the stackability with all streams, but we
are definitely be able to use the abstraction which is currently spread
between different bits of gitno.

- [x] Split the current code into different streams
- [ ] ~~Add streams for SecureTransport and GnuTLS~~
- [ ] ~~Make the HTTP subtransport request a generic TLS stream~~
- [ ] ~~Allow the user to specify their own TLS stream~~

Apart from providing clarity in the network code, this should pave the way to getting different TLS implementations working together, and even provide a way to plug into this from outside the library.