Diagnostic takes symbolic error reasons instead of messages.

Addresses #115

There's a bit more refactoring here than I expected, though:

* All calls to the various `diagnostic` DSL methods are now parenthesis-less for easier automatic transforms.
* Rather than overloading the signature of each DSL method (to make `reason_info` optional), it seems a lot cleaner & clearer to just pass `nil`.

As best I can tell ([GitHub](https://github.com/search?q=%22Parser%3A%3ADiagnostic.new%28%22&type=Code&ref=searchresults), [Google](https://www.google.com/search?q=%22Parser%3A%3ADiagnostic.new%22&oq=%22Parser%3A%3ADiagnostic.new%22&aqs=chrome..69i57.3403j0j4&sourceid=chrome&espv=210&es_sm=91&ie=UTF-8)), Rubocop is the only downstream user that will be broken by this (and only in their tests). I'll be submitting a follow-up pull request there.