compiler: Add range metadata to isUndefined load

isUndefined can only be 0 or 1. Let LLVM know so it can generate better
code.
compiler: Support planning type checks inline

If we have any type information (i.e. the tested value doesn't have
AnySchemeType) plan our type check inline. This allows us to propagate
the type information in to the type check and possibly generate better
code. This is confirmed to generate better assembly when testing record
type unions at -O2
compiler: KnownProc cleanups

Small style and formatting cleanups
compiler: Add range metadata for record class IDs

If we're dealing with a union of possible record types we can pass
through those constraints to LLVM. This is potentially useful as the
record class ID field is 32bits wide but in most programs that range
will be very sparse.

Unfortunately we can't produce ranges when testing for types that aren't
unions of specific record types. That is because record class IDs are
lazily assigned by TypeGenerator during codegen so we don't know the
possible record class IDs up front.
stdlib: Implement (llambda mpair)

This is identical to the interface provided by the Racket standard
library. At the moment this isn't terribly useful as normal pairs can be
used. However, pairs are about to become optionally immutable while
mpairs will always have mutable behaviour.