Allow exclamation point in password

This PR fixes a problem I was having authenticating with a password that included an exclamation point. I've also added a number of tests for the method I changed, util.url_add_authentication.

I'm no expert on this, but reading RFC1738, it appears exclamations are allowed to be used unencoded:
```
Thus, only alphanumerics, the special characters "$-_.+!*'(),", and
reserved characters used for their reserved purposes may be used
unencoded within a URL.
```

Please note, that I sent a separate PR earlier that also affected util.py, and since both this one and that one required a new test/util file, I decided to base this change off my first one. If that's a problem let me know and I can clean it up however you like.