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.
you should use `list_of_sexpr_to_code` here