Implement split() for TcpStream and UnixStream

This is part of the overall strategy I would like to take when approaching
issue #11165. The only two I/O objects that reasonably want to be "split" are
the network stream objects. Everything else can be "split" by just creating
another version.

There are two approaches which can be taken when splitting an object. One method
is to actually split into Reader/Writer halves. I believe that it's more
appropriate to return TcpReader/TcpWriter in order to retain inspection of
things like the peer name and local socket name. The second method is to
implement clone() for the stream, returning a TcpStream itself. This achieves
the "splitting" aspect by having two handles to the same stream, but it allows
for things like simultaneous reads and simultaneous writes.

I initially decided to go with clone(), but I was persuaded out of doing so in
favor of expressing more information through the type system. We already have
reader/writer halves in terms of channels, and it seems more analgous to do the
same for I/O objects. Implementation-wise I decided to implement this in terms
of clone() (it was easier to do for native/green impls), but the high-level
std::io API will not expose the clone() functionality.

The cloning support is pretty specific per platform/lib combination:

* native/win32 - uses some specific WSA apis to clone the SOCKET handle
* native/unix - uses dup() to get another file descriptor
* green/all - This is where things get interesting. When we support full clones
              of a handle, this implies that we're allowing simultaneous writes
              and reads to happen. It turns out that libuv doesn't support two
              simultaneous reads or writes of the same object. It does support
              *one* read and *one* write at the same time, however. Some extra
              infrastructure was added to just block concurrent writers/readers
              until the previous read/write operation was completed.

I've added tests to the tcp/unix modules to make sure that this functionality is
supported everywhere.