Beefing up error checking in SingleResultFuture
Avoid double-freeing of ByteBuf of the body.
Checking for null ResponseBuffers return value
A working implementation of the Stream interface based on Netty 4.0.  While it works, it shows a lot of problems with the Stream abstraction.  The fact that Netty has it's own ByteBuf class means we have to copy from Netty's ByteBuf to our own.  And the fact that reads are separated from writes in the Stream API means that there has to be a ping-pong between readAsync and the read handler that we give to Netty.
Making NettyStream private.
SSL support in NettyStream
Using PooledByteBufAllocator in NettyStream
Handling exceptions better in NettyStream
Created new implementation of org.bson.ByteBuf that wraps an io.netty.buffer.ByteBuf, and an implementation of BufferProvider which uses it.
NettyStream now works only with NettyByteBuf and is optimized for it.
StreamFactory and InternalStreamConnectionFactory now also determine the BufferProvider that must be used with Stream instances that are handed out.  This is so that
the Stream can be optimized for use with a particular implementation of ByteBuf.
Changed Stream interface so that it's the Stream's responsibility to allocate the ByteBuf returned from read or readAsync.  This allows for zero-copy reads with Netty.
Making Netty optional.  By default the NIO2 implementation of Stream will be used if async is enabled.  Set the system property org.mongodb.async.type to "netty" to enable Netty.
Now that we have a Netty Stream implementation that supports SSL and async, removing custom-built SSL NIO Stream implementation
Connection and Stream now extend BufferProvider, so no longer have to pass a BufferProvider through every level of abstraction.