JAVA-1258: Added support for a closed type system for BSON, which among other things includes a type-safe BsonDocument class as well as a BsonDocumentCodec.  Introduce a BsonValue base class for all BSON types, and added ones that were missing, most notably BsonDocument, BsonArray, and the missing primitives like BsonInt32, BsonInt64, BsonBoolean, etc.
JAVA-1258: Added BsonDocumentWriter, a BsonWriter whose sink is a BsonDocument
JAVA-1258: Changed BSONReader and BSONWriter to interfaces, and added AbstractBSONReader and AbstractBSONWriter.  Refactored AbstractBSONReader to pull more behavior up, to make it easier to write subclasses.
Fixed a bug in BSONBinaryWriter.pipe when used to pipe a document that is a field value of another document.
JAVA-1258: Created BsonDocumentReader class that supports a BsonDocument as the source of a BSONReader.
Added missing Copyright
JAVA-476: Changed CollectibleCodec interface to have three methods, so that it doesn't have to return the existing id unless needed.
MongoCollection now has a Codec property instead of a CollectibleCodec property, and does instanceof check on it as necessary.
All driver tests passing with BsonDocument-based Operation and Protocol implementations
Fixed bug in DistinctOperation, which was assuming that all the values are strings.
driver-compat tests all passing except for field name validation
Added field name validation to BSONBinaryWriter, and move reponsibility for validator configuration from Codec implementations to the various RequestMessage subclasses.
Added exclusion of $db, $ref, and $id to StorageDocumentFieldNameValidator to support special DBRef type
Fixed DBCollection.update so that it relies on ReplaceOperation or UpdateOperation as appropriate.