aiagnostic 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`.