Tear everything back to just the scanner and beginnings of parser.

I've reached the conclusion that there are some fundamental design errors
in the design of the intermediate language that were causing the analysis
and code generation steps to be far more complicated than necessary.

Removing everything after the parser also gives an opportunity to give
the parser a bit of a spring clean.

This also eliminates the ill-conceived "CompilerState" object in favor of
in-band error reporting via some special error-marking AST nodes. This
allows parsing errors to be handled only when the relevant AST subtree is
processed, meaning we won't report errors in parts of libraries that
aren't used by the current program.
Introduce a new diagnostics system.

Rather than having random exception types sprinkled all over the codebase,
we create a central registry of diagnostics. This allows them to all
share the same mechanism and should make it easier to do things like
allowing the user to suppress certain kinds of diagnostic, or to produce
localized versions of the diagnostic messages once they've stabilized a
little bit.
Refactor the scanner.

Previously our scanner was a bunch of extensions piled on top of plex's
Scanner. That's still largely true, but we split up our customized
plex Scanner, where our grammar is defined, from our public Scanner
interface, which provides a higher-level API that's more convenient for
the parser.

In particular, we now exclusively emit real Token objects rather than
tuples, so tokens can carry with them a source location, and we now
always emit SourceLocation and SourceRange objects and never plex's
location tuples.

Finally, SourceLocation now calls the first column 1 rather than 0, for
consistency with the line numbering. (It always bugged me that plex uses
1-based line numbers but 0-based column numbers.)
Refactor the parser to be a class.

Previously we had each parser function accepting a state and a scanner
from the caller, and all of the calls shared the same values for these,
so it seems more natural to wrap the whole thing up in a class that can
maintain that state.

The 'state' parameter is actually no longer needed -- the CompileState
object was removed in an earlier commit anyway -- so the Parser just
wraps a Scanner.
Remove the compiler module.

It will eventually be replaced with a more flexible compiler driver
module built in dependency injection style.
Drop the test coverage minimum for the moment.

While we're rebuilding the test coverage is intentionally very low. The
tests will return once things are a little more stable.
Debug helper to print out ASTs for inspection.
intermediate/__init__.py to start
Stub out operand types.
Stub out instruction types.
ControlFlowGraph/BasicBlock stubs.
Beginnings of an IR builder utility.

This will be the new mechanism for lowering ASTs into IR.
Remove defunct AstNode.find_assigned_symbols interface.
Remove defunct interfaces for evaluating ExpressionList nodes.
Scope class with support for various kinds of symbols.

The kind of symbol generated will depend on the declaration context. e.g.
variable declarations within functions will produce local variables.
Rename the "isolate" instruction to "end".

Just a cosmetic change. This name seems a little clearer as to what the
purpose of this thing is.
Default impl for Symbol.codegen_name should print self, not builder.
Symbol interface needs both load and store implementations.
Correct docstring on ErroredExpression class.
Indicate which expression types can be lvalues.