Support for generating functions

This only tests for one block functions. The current API is very ugly
for generating phi graphs. It will hopefully change soon.
Compress the definitions of some enum-likes

This declares toIr as a value parameter on the abstract superclass
instead of overriding it on every subclass. This is equivalent but more
terse without sacrificing readability
Add test for multi block functions

This also adds the option to pre-declare blocks and define them later.
This weakens our compile time safety but allows blocks to be declared in
order. Otherwise, all the leaf blocks must be added first and then the
restrest of the blocks in reverse order of execution flow.
Add support for building LLVM modules

This is capable of emitting IR for a simple hello world program
Add support for accessing LLVM function args

This names the arguments in our function definition and allows access
through the IrFunctionDecl.argumentValues map
Generate an empty main() function

This causes no functional change but it's a starting point for code
generation
Change builder methods from protected to public

The anonymous subclass mini-DSL is cute but it makes it very hard to
delegate IR building to other methods/objects. Still allow the anonymous
subclass syntax but make the builder classes non-abstract and mark their
methods public so they can be used after they've been constructed
Rename the IR builder classes as *Builder

This more explicitly separates the builder classes from immutable value
classes like IrLabel, IrFunctionDecl, etc. The renames are
- IrBlock => IrBlockBuilder
- IrFunctionDef => IrFunctionBuilder
- IrModule => IrModuleBuilder