Fix composite struct literals
Modify TypeMap.ToLLVM to store/lookup types by their string.

Some types.Type structs have slice fields, which are not comparable.
So keying the types map on the type interface was leading to multiply
mapped types, which would not be considered equal by LLVM.

There are two outstanding problems with the new approach:
 - No differentiation between types from different packages.
 - It's slow.

It may be worthwhile investigating implementing a custom hashmap later.
Fix multi-clause switch cases
Type-check init functions
Zero-initialise constants without explicit initialisers.
Implement slice-to-nil comparison
Implement unsafe.Sizeof for structs
Don't resolve var type object for anonymous vars
Implement array slicing
Extend support for multi-result function calls.

This adds support for directly returning the result of calling a
multi-result function from a multi-result function.
Implement unsafe.Sizeof for arrays
Fix bug in multiple assignment
Make int 32-bit regardless of architecture for now.

Later on, int will be made be made 64-bit on 64-bit architectures.
Implement type switches
Implement shift operator implicit type conversions.

This is hacky and incomplete. I'll wait for exp/types to finish this.
Update test case
Fix for typechecking shift exprs
Implement labeled statements, goto.

I haven't implemented labeled continue or break yet.
Fixes to TypeSwitchStmt handling
Create self-contained runtime package.

I'm copying gc's runtime Go source files into llgo, tweaking
them slightly.