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.
can you remove this newline?

visually it implies that the functions aren't dependent