Allow logical negation operator (!) to be overloaded

I think this is pretty self-explanatory, but this is my first time working on rustc, so it's possible I did something wrong.

This closes #4105.