Add stub semispace allocator

This just allocates a fixed 4MiB block and linearly allocates Cons
instances from that block. If the end of the block is reached the
program aborts.

_lliby_alloc_start and _lliby_alloc_end are exposed to codegen so it can
directly allocate Cons instances. If allocation fails it will call
_lliby_alloc_cons (an alias for alloc::allocateCons) which in the future
will perform GC and return the new allocation.
Declare the NFI rest arg using boxed-list-element

boxed-pair is inaccurate as it's possible for the empty list to be
passed in. Switch to boxed-list-element which is the union of pair and
empty list. This only affects (native-function)'s syntax; there's no
functional changes.
Detect wrong element type w/ 1-index getelementptr

The return type of a 1-index getelementptr is always the passed type.
Detect this case and throw an exception if it's encountered.
Declare bt.BoxedDatum's accessors on bt.BoxedType

This means it's possible to generate a type ID or GC state access on a
bt.BoxedType without having a specific subclass. Our codegen memory
allocation code will use this to set the types of the datums it returns.
codegen support for cons allocation

Add GenConsAllocation which will allocate the specified number of
conses. It will attempt to directly allocate using the exported
_lliby_alloc_{start, end} pointers and if that fails it will fallback to
invoking the runtime's allocator to perform garbage collection.

This result is wrapped in a ConsAllocation which will only return
pointers initialized to a specific type ID. It also verifies that the
requested cons is in range for the allocation size.
Add support for rest arguments

- Add GenProperList which can generate proper lists out of arrays of
  %datum* at runtime. It builds on top of the codegen allocator work in
  %the previous commit

- Make GenApplication use GenProperList to build a proper list of rest
  arguments for functions taking rest args

- Add an implementation of (list) that just returns its rest arg for
  testing purposes
Make BoxedSymbol include the right members

It was previously including BoxedStringMembers probably due to a copy
and paste error. Switch to BoxedSymbolMembers.
Introduce datum_cast<>

This is a C++-style casting function that replaces the
BoxedDatum::asBoxed* functions. This is slightly more verbose and
requires including the headers of the type being casted. However, it
looks more like idiomatic C++ and allows things like templated proper
list iterators to work cleanly
List improvements

- Fix (list-copy) for improper lists and add unit test

- Create a new templated ProperList class which can only be successfully
  constructed if the passed list element is the head of a proper list
  with all car values being of the ProperList's templated type.

- Add an STL compatible ProperList::ConstIterator. This allows use in
  range-based for loops and STL algorithms.
Implement boolean=?

This splits the nfi.CBool type in to nfi.CStrictBool and nfi.TruthyBool.
Strict bools can only be converted from the Scheme boolean type. Truthy
bools follow the Scheme truthiness rules - namely, everything but #f is
true.

Native functions can only return strict bools; truthiness doesn't make
sense here. Change (not) to accept a truthy bool to maintain its
previous behavior. (boolean=?) only accepts strict bools to comply with
R7RS