Remove list type hints

These only work with basic cell types. This will be superseded by fully
supported list types in the frontend.
runtime: Strongly typed promises

Change the lazy library from using pairs to using explicit record types.
This has a number of advantages:

- Typed lists want pair mutation disabled. This means our base libraries
  can't use (set-car!) or (set-cdr!)

- <promise> is a first-class type which can be used in procedure
  declarations etc. This also prevents lists and pair from accidentially
  being used as promises even in the absence of type annotations.

- This will generate better code due to explicit typing once the planner
  supports inline record access
compiler: KnownProcedure refactor

- Split out KnownProcedure in to a KnownProc abstract class and
  KnownUserProc final subclass. KnownProc never calls its constructor to
  prevent subclasses from forgetting to override a constructing method

- Move the logic for planning known procedures (report procs and type
  predicates so far) from PlanExpr to the KnownProc subclass. This
  scales better to more types of known procedures
compiler: Shorten record-related class names

Drop the "Type" in RecordType{Contructor,Accessor,Predicate}. "Records"
unambiguously refers to record types in the context of the compiler and
these names are unwieldy.
compiler: Minor PlanRecordConstructor cleanups

- We only need to create temp values for initialized fields

- Don't open code ps.Temp()
compiler: Support for inlining record procedures

This allows inlining record procedures (constructors, accessors and
predicates) directly in the the plan of the invoking procedure. This
means records are now as efficient as pairs with the added option of
strong typing.

This more than reverses the performance loss from switching promises to
records. It will also allow the upcoming mutable/immutable pair split to
happen without any appreciable performance loss.