compiler: Generate cleaner type checks for unions

Change branchOnType and if the true/value branch return static
true/false respectively it will skip the phi completely. This improves
the code we generate for testing union types by removing a useless phi
for the last member in the union. This doesn't affect code generation
but makes the type predicate IR easier to read.
compiler: Disallow re-(define) in llambda dialect

This rejects a second (define) for an already bound top-level binding.
This applies to variables, syntax and types. This catches accidental
redefinitions and avoids the insane R7RS behaviour of creating an
implicit mutable.

For compatibility the R7RS dialect still allows redefinitions

Closes #26
compiler: Support typed rest arguments

This introduces typed rest arguments for Scheme procedures using
identical syntax to Typed Racket. Only uniform lists are supported at
the moment.

This also fixes an issue where the storage location for the rest
argument was defined to have AnySchemeType instead of a more specific
type. This could potentially confuse parts of the compiler in to
thinking the rest arg has a less specific type than it does.

Closes #28