compiler: Introduce concept of "stablised" types

A stablised type is the part of a Scheme type that cannot be mutated at
runtime. For example, in R7RS the stable type for (Pair <string>
<symbol>) is (Pair <any> <any>) as (set-car!) and (set-cdr) can mutate
the pair even if it's an immutable storage location.

This makes all IntermediateValues take of the stable type of their
storage location. This has a couple of immediate advantages:

- (Pairof), (Listof) and (List) constructors can be used from R7RS code
  to annotate arguments and return values safely. Any attempt to
  annotated a storage location with an unstable type will fail with an
  error.

- (Listof) etc can now be used in common (R7RS & Llambda) library code
  without (cond-expand) or strange hacks. This changes the Llambda
  standard library to use explicit list types where possible to increase
  type safety

The long term benefit will be the ability to introduce unstable types to
Llambda such as (Vector)/(Vectorof)