Added server selection timeout to cluster settings.
Added selectServerAsync method to Cluster for efficient asynchronous server selection.
The BaseCluster implementation maintains a concurrent deque of pending server selection request
and a single background thread to iterate through them whenever a new cluster description has been published.

   JAVA-1200
DRY'd it up and optimized async path by storing and comparing the current phase in the server selection request

  JAVA-1200
Make it explicit
Removed self-assignment of phase