Add generation of Scala BoxedType objects

This creates a new object in the llambda.codegen.boxedtype for each
boxed type. Currently the objects just contain the corresponding LLVM
type. In the future they can contain extract/insert methods for each
field inside the type's structure.
Use BoxedValue.llvmType instead of hardcoding

This means our LLVM type will follow the one generated by gen-types.py.
Rename BoxedValue => BoxedDatum

This both matches the NFI name and hopefully conveys that it's abstract
and doesn't carry a value. Concrete subclasses still are suffixed with
"Value" to indicate that they contain data fields.