Fix segmentation fault from calling from_string with a non-string

* Calling BSON::ObjectId.from_string with a BSON::ObjectId segfaulted
* C function attempted to use BSON::ObjectId as a String
* Adds separate check/exception for non-String arguments
Allow read preferences in URI with no replica set.

[ RUBY-563 ]
RUBY-529 raise exception for multiple attempts to auth on the same db

Server side, MongoDB will log out the first user when a second authentication
is issued for the same database. In the past we've handled this by just quietly
updating the authentication credentials we have stored for that db.

The driver spec for auth now requires that we raise an explicit exception so
that users don't unknowingly log out previous authentications applied to the
database.