Generate BoxedType methods for accessing fields

Generate methods for accessing individual fields by name within a boxed
type. This performs basic type checking before using the correct
getelementptr incantation to access the field.
Support simple bitwise instructions

Add support for generating "and", "or" and "xor" instructions. The "and"
instruction is needed for runtime type assertions and the code is easily
generalized to support "or" and "xor" at the same time.
Refactor gen-types.py's type ID handling

- Rename type assertions" to "type conditions" to reflect they can be
  used for non-fatal tests

- Bring back an explicit BoxedType.type_id property. The code to support
  it is trivial and it simplifies users of BoxedType

- Remove TypeUnionAssertion and instead make type_conditions an array.
  This prevents arbitrarily nested type conditions which would
  complicate LLVM code generation

- Make TypeBitmaskAssertion.bitmask an integer and accept/generate
  hexadecimal bitmasks
Remove anonymous subclass builder support

Using anonymous subclasses as a mini-DSL was cute and worked well for
trivial examples. However, it fell apart quickly once instruction
generation had to be delegated to another function.

Remove all support for anonymous subclassing of the builders and switch
to a traditional OOP-style builder API.
Build BoxedType methods to generate IR type checks

This extends gen-types.py to build type checks for each boxed type
except BoxedDatum. For most types this simply loads the type ID pointer
and does a direct integer comparison. However, for supertypes it will
either check the type ID of each of its subtypes to use a bitmask if one
is defined

At the same time this renames the "pointerTo*" accessors to
"genPointerTo*" to denote that they generate code.
Expect a pointer in the genPointerTo* methods

Previously the methods were checking for a structure while getelementpr
expects a pointer to a structure (or other aggregate type).