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.
what functionality is missign?