After reading some input, we need to figure out which context each symbol is in before we evaluate it. I just picked the parser as the place to do this.

To make this work, the parser uses `Definitions.lookup_symbol` when it needs to convert a short name into a fully qualified one with context marks. The `Definitions` instance is just passed into `parse()`. This is easy when we're evaluating user input, because we already have the definitions to hand at that point.

During startup, while we're parsing things like builtin rules, a `SystemDefinitions` instance gets used instead of the real `Definitions` (because at that time we're building up the definitions, and I thought that might lead to problems with definitions that reference each other). `SystemDefinitions` is just a mock that acts as if every symbol already has a definition in ```System` ```.

A different way to do this might be to add a pass that happens after parsing, but before evaluation. The pass would go through the parsed expression, adding context names to unqualified symbols. I chose not to do this because it felt awkward, and might lead to strange bugs if it was forgotten. I also thought that having the lexer/parser do the context lookup was the way Common Lisp packages worked, so it felt like there was some precedent there.

The comments are just so I don't forget to explain what's going on here later. I was planning to rebase this patch set once all the test failures are fixed, squashing it down to more logical changes and getting rid of TODOs/FIXMEs.

Sorry for the mega-post. I'm hoping that made it clearer, but re-reading it I'm not totally sure!