Removed redundant method Server.getServerAddress (use Server.getDescription.getAddress() instead).  Added Javadoc for the remaining methods.
Introduced ClusterableServer abstraction so that the details of a Server interacting with its containing Cluster are not exposed by the type return by Cluster.getServer.
Removed test that has race conditions causing it to fail some times.
Got rid of confusing method BSONReader.getNextBSONType, since you can always use BSONReader.readBSONType instead, though not in the same context (you have to call it before you call readName())
Rationalized the Pool and BufferPool interfaces.
Added support to PowerOfTwoByteBufferPool for getting buffers bigger than the max pooled size.
Dealt with race conditions between run and close methods, to avoid spurious log messages.
Pushed Server.closed/isClosed into ClusterableServer
FindBugs warning fix.  Added !isClosed assertions in DefaultServer.
Made AsyncSession.getConnection methods return MongoFuture<AsyncConnection>, so that they can be non-blocking.  All the async operations now use this future in a non-blocking fashion (by registering a callback) and return immediately. The non-blocking behavior is implemented using an Executor to execute a simple Runnable that gets a server/connection and initializes the future with it.
Refactored AsyncSession to make it easier to implement asynchronous cursors properly.  Introduced a sub-interface of AsyncSession called AsyncServerSelectingSession and pulled down AsyncSession.getConnection(ServerSelector) into it.  Then added a getBoundSession(ServerSelector, Binding) method which return a new Session that is capable of supplying connections that are bound to either a single server that is cached based on the ServerSelector, or bound to a single connection to a server based on the ServerSelector.
Making the bound async connections classes package-private
Refactored Session to make it easier to implement  cursors properly. Introduced a sub-interface of Session called ServerSelectingSession
 and pulled down Session.getConnection(ServerSelector) into it. Then added a getBoundSession(ServerSelector, Binding) method
 which return a new Session that is capable of supplying connections that are bound to either a single server that is cached
  based on the ServerSelector, or bound to a single connection to a server based on the ServerSelector.
Moved all session-related classes in to org.mongodb.session package
Updating cluster description whenever a server is added or removed.
Now discovering arbiters in the cluster as well.
Style changes to main build file
Covered ReplicaSetStatus with jMock based tests
Removed Connection.sendAndReceiveMessage
Small change in tests so that the ones depending on a discoverable replica set will still pass when not actually in that test mode.
Moved inner enums to outer scope