Renamed SingleServerCluster
Added SingleServerCluster interface with getDescription method, and Server.getDescription method too.
Added copy of java.util.concurrent.Phaser (new in Java 7) class so that it can be used in a Java 6 environment.
Changed Phaser class to use AtomicLong instead of sun.misc.Unsafe, which throws a security exception if used outside of JDK code
And second construct to MongoTimeoutException that takes a cause.
static import of Fixture.getBufferPool
getMaxBSONObjectSize is now getMaxDocumentSize, so changed the method call.
Using the Phaser to handle notification of a server that is now available.  The phaser gives us a lock free mechanism of notifying all waiting threads of the condition of a server becoming available, while avoiding race conditions.
Renamed ServerPreference to ServerSelector.  ReadPreference no longer implements it, instead added a ReadPreferenceServerSelector class which forwards calls to the readPreference instance that it wraps.
Got rid of ReplicaSetMemberDescription by pushing down its remaining functionality into ServerDescription.  Next step is to generalize ReplicaSetDescription to ClusterDescription
Renamed ReplicaSetDescription to ClusterDescription
Changed ServerSelector.choose return type from single ServerDescription to a List<ServerDescription>, putting the responsibility on the cluster of choosing which of the acceptable servers to use.  This makes more sense because the cluster is in a better position to do that.  Currently we just randomize the choice, but it's not unlikely that in the future it will be based on some other heuristic, like load, or replication lag.
Refactored ClusterDescription in preparation for moving acceptable latency test out.
Added equals/hashCode/toString to ReadPreferenceServerSelector
Added equals/hashCode/toString to PrimaryServerSelector
Fixed a few bugs in DefaultServer: 1. cancelling scheduled future on close.  2. Properly constructing ServerDescription with ServerAddress on error notification.
Introduced ServerType enum in order to properly implement helper methods ServerDescription.isPrimary/isSecondary/hasTags, which all now return true if the server is both ok and of type ShardRouter or StandAlone.
Introduced DefaultCluster base class and refactored the Cluster implementation classes to use it.
Removed Cluster.getAllServerAddresses and made sure that Cluster.getDescription always returns a description contains the seed servers
Removed unnecessary field serverAddressToDescriptionMap in DefaultMultiServerCluster.  Added ClusterDescription.getByServerAddress(ServerAddress)