Finish Grammar Refactor

Split the parsing from the grammar specific computation. This is now performed
by instance methods on the `Grammar` object. This means we don't have to pass
a whole load of context around all the time, which is good.

One refactor that jumps out from this is to make the name of a symbol available
as a member variable.