Finish interpreter exceptions, simplify variables

The exceptions are now in their own module, and have been fleshed out to
cover all of the interpreter and runtime exceptions (but not those from
the lexer or parser, which will be updated in the future). All of these
exceptions are in every interpreter's scope so they can be requested by
name. The test harness and run script have been updated to differentiate
between Grace exceptions and internal errors. Catching packets and stack
traces are next.

As part of this change, the way variables (and type definitions) are
defined has been updated to use methods from the runtime. Hoisting
creates methods that throw an Undefined Value exception until the value
is set (or Uninstantiated Type for types). A test for the Invalid
Inherits exception has also been added.