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.
It looks like having newlines between these actually prevents merge conflicts :angry: