compiler: Add sst.ResolvedSymbol extractor

This is for pattern matching symbols that resolve to a specific value.
This is becoming more common as the frontend moves from explicit symbol
name matching for special forms to hygenically resolving to a specific
primitive.
compiler: Change (native-function) syntax

Have (native-function) take a signature in syntax analogous to the
procedure type syntax. Normally this is the same length as the previous
syntax except for functions returning <unit>. However, it has a number
of advantages:

- Its structure is identical to the procedure type syntax. This makes it
  easier to read for users used to Scheme procedure types. It also
  harmonizes the syntax with that of callback procedures passed to
  native functions.

- An unlimited number of attributes are allowed in this form by
  appending after the signature. Attributes have also become hygenic -
  "noreturn" is a syntax primitive exported by (llambda nfi)

- If polymorphic native functions are implemented this allows the (All)
  type constructor to be used in a natural way
stdlib: llbase_length doesn't need world ptr

llbase_length used to take a world pointer when it could fail on
non-lists. However, now that the type checking is done by the compiler
we don't need the world pointer at all.
compiler: Fix whitespace in ProperListTypeSuite
compiler: Fix test name typo
stdlib: Tighten (digit-value)'s return type

(digit-value) can only return exact integers or boolean false. Reflect
that in its (world-function) signature.
stdlib: Stub out (list-copy) for immutable pairs

With immutable pairs there is no guarantee for pairs with the same
content to occupy different cells. This means (list-copy) can be legally
implemented by just returning its argument.
compiler: Fix infinite recurse with (Listof) names

If the member type of a proper list was recursive we wouldn't trigger
the (Rec) type logic and end up infinitely recursing when attempting
to name the member type.

Fix by only special casing the (Listof) type name if the member type is
non-recursive.
stdlib: Add <readble> type

The <readable> type is the union of all types that can be read by
(read). This is exported by a new (llambda read) library which is
identical to (scheme read) with the additional export.