JAVA-836: Only log on state change in server monitor thread.
Added assertion for session open
Implementing read preference specification for command handling.  Only "obedient" commands obey the read preference.  All others are silently routed to the primary.  There is some discussion that instead we should throw an exception, but that has not been finalized.

This also fixes JAVA-835, in which it was discovered that we change the read preference even with a Direct connection to a secondary, which goes against the intent.
Refactoring async operations in preparation for upcoming change to enforce read preference spec for async commands:
Moved async operations out of their own package
Added ClusterDescription parameter to the constructor
Implementing read preference specification for async command handling.