add GRAMMAR structure and dependencies between grammars

* Partly based on menschenkindlein's
  implementation
  (Menschenkindlein/esrap@63baec4e20591d3c1517fae88a364de8a39ebb12).

* Grammar objects are a bit like CL packages:

  * they have a name and optional :DOCUMENTATION
  * they can :USE other grammars
  * they act as containers for rules
  * redefinition is allowed and preserves existing rules

* Changed interface:

  * GRAMMAR-NOT-FOUND-{ERROR,WARNING}     [condition]
  * RULE-NOT-FOUND-{ERROR,WARNING}        [condition]
  * INVALID-EXPRESSION-{ERROR,WARNING}    [condition]

  * GRAMMAR-NAME                          [function]
  * GRAMMAR-DEPENDENCIES                  [function]
  * GRAMMAR-RULES                         [function]

  * DEFGRAMMAR                            [macro]
  * IN-GRAMMAR                            [macro]

  * *GRAMMAR*                             [variable]

  * MAKE-GRAMMAR                          [function]
  * FIND-GRAMMAR                          [function]
  * (SETF FIND-GRAMMAR)                   [function]

  * DEFGRAMMAR, DEFRULE and PARSE signal full warnings (the new
    warning conditions introduced above) at compile time when constant
    references to grammars or rules cannot be resolved or when invalid
    expressions are detected.

  * The *-RULE functions, DEFRULE and PARSE accept a new keyword
    argument :GRAMMAR which defaults to the value of *GRAMMAR*.

  * DESCRIBE-GRAMMAR accepts the destination stream as a keyword
    argument instead of as an optional argument.

* Changed implementation:

  * DEFGRAMMAR, IN-GRAMMAR and DEFRULE produce code which is evaluated
    at compile-, load- and runtime. This is necessary in order to be
    able to define and use a grammar in the same file.

  * FIND-RULE traverses used grammars to find the requested rule.

  * The new functions UPDATE-RULE-DEPENDENCIES, RECOMPILE-CELL are
    called after adding/removing rules/used grammars to update
    dependencies and recompile rules.

  * Rule dependencies are expressed in terms of referencing rule
    cells, not symbols.

* New tests for grammar objects and related lookup and redefinition
  issues have been added. New tests for expression and argument
  checking have been added.

* Documentation has been extended. In particular, a section about
  grammar objects has been added.

* Examples:

  * example-sexp.lisp now uses a separate grammar called SEXP

  * example-sexp-xml.lisp contains a new grammar called XML which uses
    the SEXP grammar to demonstrate grammar dependencies (originally
    written by Menschenkindlein)
Temporary cleanup commit: should be squashed with previous commit