Fix authentication process for replica sets

The authentication is always done with the write protocol (on the primary), so while using read preferences on secondaries, the authentication is never done.

It is because the authentication has to be linked to a protocol for it to work.
Before the authentication always picked the write protocol so it was not working on secondaries.

The problem is that the authentication is initiated from MongoClient (only for this case) and the authentication mechanism was in MongoDB. So besides moving the authentication code into MongoClient or Protocol, the only way was to use a public function from MongoDB and pass the protocol.
That's how the NodeJS driver did it: https://github.com/mongodb/node-mongodb-native/blob/2.0/lib/db.js#L1014.
Maybe it is possible to use a public _auth function to keep the official prototype?