Split LazyBsonDocument into two classes: MaterializedOnDemandBsonDocument and LazyBsonDocument. Changed BsonDocumentWrapper to be a subclass of MaterializedOnDemandBsonDocument instead of BsonValue. LazyBsonDocument and BsonDocumentWrapper are just two different kinds of MaterializedOnDemandBsonDocument.