Use ClassInfo instead of GrammarDefinition

This has the following advantages:

- Not having to manually define a type that differentiates
  our grammar elements saves a lot of code
  (run a 'git show --stat' on this commit)

- Not having an additional identifier element for each
  Token and ASTNode when you can just use ClassInfo saves on memory.
  Tokens and AST nodes automatically have their "GrammarDefinition"
  baked in - it's just the .classinfo property.

- It is assumed that you would want to create a class for each type
  of token and AST node you use.
  The 'asTerminal' and 'asNonTerminal' calls from GrammarElement
  are no longer needed (if they were in the first place)
  and can be replaced with a simple language feature - casts.
  You also get the benefit of casts supporting class hierarchies,
  though one probably shouldn't go full-Java and set up
  a token or AST node hierarchy eleventy billion classes deep.

GrammarElement is left as a
[marker interface](http://en.wikipedia.org/wiki/Marker_interface_pattern).
This is usually criticized inasmuch as a marker interface cannot be
"unimplemented" and can be replaced with annotations,
but in the future we may add common behavior to all GrammarElement classes.
We can keep an eye on it and return to this "issue" later.