Split API classes and interfaces

ReadPreference and WriteOptions classes need to be defined. Commands don't always require a ReadPreference, so I'm not sure how best to handle this. Additionally, commands and queries alike probably need general options to handle socket timeouts (something I imagine was intended to be handled with WriteOptions). Perhaps we need a ClientOptions argument, too?