Replace et.Let with et.Bind

et.Let mirrored the behavior of R7RS's  (let) where it associated
bindings with a list of expressions over which they were effective. This
caused some difficulty with loading libraries as loaded libraries have
their bindings effective past the end of the library

Instead, introduce et.Bind which does not confine bindings to a
particular region. The bindings are understood to be valid until the end
of the lambda.

(let) is still implemented by the frontend in a way that preserves the
R7RS sematics. This only changes the expression tree generated by the
frontend
Add FindMutableVars analyzer pass

This determines which variables are mutated at any point in the
expression tree. Mutable variables need to be treated specially by the
code generator.
Compile expressions from libraries

The expressions collected by the library loader were exposed from
DefaultLibraryLoader.libraryExpressions but they were not used elsewhere
in the compiler.

Instead of passing around a simple function to load libraries add a
LibraryLoader abstract class which defines a load function and a
libraryExpressions function. At the end of ExtractProgram prefix the
libraryExpressions to the body expressions when returning the expression
list.
Add support for setting and referencing vars

This implicitly assumes all the variable are immutable. This is a simple
implementation to get (define (native-function)) working in (scheme
core) to build further unit tests.
Support for generating select instructions

This is basically shorthand for br + phi that doesn't cause any new
blocks. This can be used to simplify conversion of i1 values to
BoxedBooleans
Make LiveValues proper classes

Make LiveValue behave in a more OOP fashion. Instead of spreading each
values logic across multiple conversion classes, centralize all their
logic in a single Scala file.

LiveValue only requires:
- possibleTypes to indicate which types a value can have
- toNativeType to convert the value to the passed nfi type

Various subclasses of LiveValue can then implement that interface
and transparently work with the rest of the code generator
Replace nfi.Bool with nfi.CBool

The C++ ABI doesn't have a i1 type. Boolean are passed around as chars.
Replace the 1 bit Bool with the 8 bit CBool.
Remove BoxedExactInteger instance caching support

Instead of complex instance caching schemes rely on the stdlib and
generated code using unboxed values whenever possible.
Remove nfi.UInt64

Our internal integer type is a signed int64. This means we can't
represent all the values of an unsigned int64. In the future it might be
possible to generate a runtime check and fail the conversation at
runtime. For now just remove it completely
Allow trailing dots on exact integers

In R7RS "3." is the same as "3" but different from "3.0". Hack the
parser to allow this
LLVM floating point type improvements

- Rename SingleType/SingleConstant to FloatType/FloatConstant. This
  reflects their name in both LLVM IR and Scala

- Make FloatingPointType take an explicit "bits" parameter. This is
  useful for both extending the floating point types in the future and
  making fpext/fptrunc more generic once they're implemented