Mark @ and ! as a symbol constituents, as suggested by @Clemens-H.

Generally only [a-zA-Z0-9] should be word constituents, and everything
else should be a symbol constituent. See
http://emacs.stackexchange.com/q/1075/304 for a discussion.

This also enables us to simplify our regexps.
Factoring out a types regex.