Reduce hardcoding of field types in Scala

- For every field introduce a {fieldName}IrType member on its BoxedType
  instance that contains its IrType. This can be passed to
  IntegerConstant etc to specify the exact type required

- Make BoxedType.createConstant convert integer values to the correct IR
  value internally. This ensures that plain integers can be passed from
  Scala and end up as the correct IR type.
Statically check that all boxed types fit in Cons

This came up when the recordtypes branch accidentally overflowed a Cons
cell. This is trivial to check at compile time, especially with C++11.

Generate an alloc/generated/sizecheck.h file that contains
static_asserts ensuring each concrete type is smaller than a Cons cell.
Squish type ID and GC state boxed fields to i8

typeId was orignally i16 because it was intended to be unique for every
record type. gcState was i16 just to take advantage of the extra space
given by alignment.

The current plan is to have a separate recordClassId field that only
exists for record types. This allows us to squish these fields down to
i8. This leaves more room with stuffing small fields and flags at the
beginning of a boxed type without overflowing our 24 byte Cons.