compiler: Switch GenSizeOf to use PtrToIntConstant

We don't need to create a variable to store the constant size of a type.
compiler: Support for record type inheritance

This adds a new record type definition form:
(define-record-type <child> <parent> (constructor ...) pred? ...)

The child type satisfies type predicates for the parent type and the
parents accessors and mutators will work transparently.

The child type can initialise any fields in the parent type by using the
appropriate field name. This unfortunately breaks the hygiene of field
names as the parent field names aren't bound to any scope. Instead, the
name of the field symbol is used literally.

The most complex part of this change is in the codegen. Instead of
allocating record types on-the-fly during codegen we now extract all the
record-like types from the plan up front. We then build a tree of all
referenced types ensuring that every "type tree" has its class IDs
allocated in a contiguous block. This lets type tests use simple range
checks on the class ID. This has a side benefit of reducing the use of
mutable Scala in codegen.
compiler: Don't create pointer to dataless records

We were creating a NULL pointer and then casting it to the record's IR
type. This is unneeded - we can just use a NULL pointer of the expected
type which won't generate IR as it's unused.