Beefing up error checking in SingleResultFuture
Avoid double-freeing of ByteBuf of the body.
Checking for null ResponseBuffers return value
JAVA-1155: 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.
JAVA-1155: Created new implementation of org.bson.ByteBuf that wraps an io.netty.buffer.ByteBuf, and an implementation of BufferProvider which uses it.
JAVA-1155: NettyStream now works only with NettyByteBuf and is optimized for it.
JAVA-1155: 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.
JAVA-1155: 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.
JAVA-1155: 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.
Added NettyStreamFactory constructor that takes an allocator and an event loop group.
Removing some Spock tests that were no longer testing anything interesting.
Adding Session parameter to Operation.execute() and consolidating calls to it to a single method.
Added Connection and ServerDescription parameter to Protocol execute and executeAsync methods and removing responsibility of Protocol implementations to optionally close the connection.