compiler: Add (Assocof) type constructor

This constructs an assocative list type which is simply a list of pairs.
This will be useful for the upcoming alist support.
stdlib: Implement (caar), (cadr), (cdar), (cddr)

This are trivial Scheme implementations taken from R7RS with type
annotations added.
compiler: Add test for (cond) occurrence typing

This already worked as expected; it merely adds a functional test
stdlib: Optimise (member) family procedures

Now that their arguments are annotated to be proper lists they don't
need to be world functions. Keep a C assert in to confirm that no
non-lists are passed in in the future.
stdlib: Implement (assv), (assq) and (assoc)

These are implemented very similiarily to the (member) family of
procedures.

An initial implementation in Scheme revealed a weakness with the current
implementation of recursive procedures: they're always considered to
introduce a GC barrier even if they never allocate memory or call
worldfunctions. This is because the procedure is conservatively assumed
to be a world function during initial planning and when the planned
function is analysed it's determined to use the world pointer during its
recursive call. This should be improved in the future.