New error condition TYPE-PARSE-ERROR

* New error condition TYPE-PARSE-ERROR and TYPE-PARSE-ERROR-SPECIFIER
  are exported from SB-INT. TYPE-PARSE-ERROR stores the offending type
  specifier and tries to construct a useful list of references.

* Parsers for builtin classes signal TYPE-PARSE-ERROR for errors.

* Parsers generated by !DEF-TYPE-TRANSLATOR now signal
  TYPE-PARSE-ERROR on argument list mismatches.

* Tests in the new file tests/type.unit.impure.lisp ensure that
  TYPE-SPECIFIER signals TYPE-PARSE-ERROR for various invalid type
  specifiers.
Handle circular arguments to OR, AND, and MEMBER type constructors

* The corresponding type translator functions now signal
  TYPE-PARSE-ERROR when encountering circular arguments.

* Minimal tests have been added in tests/type.unit.impure.lisp.
Basic parsing of structurally recursive type specifiers

The parsing works as follows:

1) VALUES-SPECIFIER-TYPE now keeps tracked of processed type
   specifiers to detect circularities. When a circularity is
   encountered a BACK-EDGE object is inserted into the type graph.

2) The new function NORMALIZE-RECURSIVE-TYPE traverses the constructed
   type graph and replaces BACK-EDGE objects with their respective
   pointees. This requires destructive modification of the respective
   containing types (i.e. INTERSECTION-, UNION-, CONS- or NOT-TYPE)

3) The new function CHECK-RECURSIVE-TYPE checks the type graph
   produced in 2) and signals an error if a BACK-EDGE survived or the
   graph contains invalid recursive structures.

Other changes

* Slots or some CTYPE structures had to be made mutable for the above
  method to work.

* TYPE-SPECIFIER now keeps track of processed type graph nodes and
  produces circular outputs for circular inputs.

* Basic tests are in tests/type.unit.impure.lisp.
TODO Support recursive types in type system functions/methods

* A new type method :RECURSIVE-P returns true if a given CTYPE is
  structurally recursive.

* Handle (pairs of) recursive types in TYPE=

  Keep track of seen pairs of types and return true for seen pairs: if
  such a pair turns out to be TYPE= in every other regard, it is
  TYPE=.

* Support recursive types in CONS-TYPE-MIGHT-BE-EMPTY-TYPE

* Support recursive types in
  CONS-TYPE-SIMPLE-INTERSECTION2-HELPER (very unfinished)
TODO Support recursive types in %%TYPEP and TYPEP source transform

* %%TYPEP keeps track "seen" types as it performs the type check

* SOURCE-TRANSFORM-TYPEP uses :RECURSIVE-P type method to detect
  recursive types and generate recursive local functions.

* Some unit tests are in tests/type.unit.impure.lisp
TODO Handle recursive /values/ in SOURCE-TRANSFORM-TYPEP

* The code generated by SOURCE-TRANSFORM-TYPEP keeps track of "seen"
  values

* TODO what about %%TYPEP?

* TODO tests?
Manual section for recursive types
Define feature :RECURSIVE-TYPES
Add EXTRACT-INTERSECTING-TYPE
Improve type derivation for CAR, CDR
Indentation of IR1-TRANSFORM-TYPE-PREDICATE
TODO temp commit: More test stuff
TODO temp commit: more random stuff
TODO temp commit: debugging stuff
TODO temp commit: SPECIFIER test stuff