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

It's a good question.  Ultimately I don't see much value extending InputStream (or extending OutputStream for writes), as using interfaces makes it easier to provide completely independent implementations. If they were interfaces I would extend them, but the fact that they are classes makes me wary.

Also, I was following the pattern here from classes like DataInputStream/DataOutputStream.  Since those classes extend InputStream/OutputStream, but also present additional API methods, those methods are broken out into the DataInput/DataOutput interfaces, so that multiple implementations can be provided (for example, RandomAccessFile).