let username and password be specified outside a uri

currently, if you use a uri without the username/password/db name inside it, ie:
`mongodb://host1.com:1337,host2.com:1337/`
it will pull the db name from the other args passed to connet():
`'name': uri_dict.get('database') or name,`
but the username and password specified in connect() will be overwritten with None:
```
'password': uri_dict.get('password'), # <---Returns None if no password was in the uri
'password': uri_dict.get('password'),
```

This forces anyone using a uri, say to make handling multiple nodes easier, to put their username and password into the uri. This isn't a huge problem, but forces some awkward manual string formatting in some setups, and there's no need for that.

I also removed a duplicate read_preference update.
this was popped off the setting we were comparing, but not within the loop. This would cause any settings with an authentication_source set to equate as not equal every time.