Added open/openAsync methods to Stream interface to make implementation simpler. Before this, implementations
either had to open in the constructor or in write/writeAsync.
Also removed unnecessary synchronization in NettyStream that made it prone to deadlock.  The Stream client
is responsible for ensuring that there is at most one call to read/readAsync and one to write/writeAsync going on
concurrently, so Stream implementations do not have to do their own synchronization.

 JAVA-1584, JAVA-1575
Removed UnacknowledgedWriteException class
Renamed MongoQueryFailureException to MongoQueryException
Renamed CommandFailureException to MongoCommandException
Renamed com.mongodb.bulk.BulkWriteException to com.mongodb.MongoBulkWriteException
Added MongoNodeIsRecoveringException and MongoNotPrimaryException

 JAVA-1570
DefaultServer no longer invalidates on a socket timeout exception.

 JAVA-1568
DBCollection Javadoc now more explicit about what exceptions it throws for write operations.
They call out DuplicateKeyException and WriteConcernException explicitly.
Added MongoWriteException and MongoWriteConcernException for use in new MongoCollection API.
Changed MixedBulkWriteOperation to take a List<? extends WriteRequest>
Changed insert/insertMany methods in new CRUD API to return void
Added support for modifiedCount in UpdateResult, which required using MixedBulkWriteOperation for
all writes in the new CRUD API, as only that operation informs the caller of the modifiedCount

As part of this, changed the exception types thrown for all single write operations in the new CRUD API
from WriteConcernException to MongoWriteException/MongoWriteConcernException

 JAVA-1569, JAVA-1587