List support

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.