Introduced BsonInput and BsonOutput interfaces

Introduced two new interfaces: 

  org.bson.io.BsonInput: replaces org.bson.io.InputBuffer
  org.bson.io.BsonOutput: replaces most uses of org.bson.io.OutputBuffer;

Lots of files changed, but most are from automated refactorings due to the name changes.

The purpose of this change is to give us more flexibility in the future to create other implementations of these interfaces.  For example, a RandomAccessFileBsonOutput, or an InputSourceBsonInput

Of particular interest to review are the current implementations of these interfaces:

     org.bson.io.ByteBufferBsonInput
     org.bson.io.OutputBuffer
     org.bson.io.BasicOutputBuffer
     com.mongodb.connection.ByteBufferBsonOutput

BsonBinaryWriter and BsonBinaryReader also have some small but significant changes to them that were forced by the API differences between the old and new APIs.

I also added comprehensive test specifications for the BsonInput and BsonOutput implementations

Yeah, I know.  The issues is that the mark method in Java's InputStream class has this, so if I want an implementation of this interface on top of, say, a FileInputStream, I'll need that limit specified.  Otherwise, the implementation has to choose one, and it might not be in the best position to know what to use.