Working semantic checking for lists

It looks like generic lists will be less straightforward than I thought, so getting semantic checking in now to ward off merge conflicts.

Semantic list checking correctly recursively checks the type hierarchy to make sure inner elements match.
Note: this generate code is a quick framework to start generating code, but doesn't work fully yet.