Add syntax to pass arguments in a list

The syntax "(F . ARGS)" can now be used to call F, passing it the
arguments contained in the list ARGS.  The first arguments may also be
passed individually, e.g:

    (F A B . REST)

Example:

    (LETREC MAIN
      (F LAMBDA (A B) (ADD (MUL A A) (MUL B B)))
      (ARGS QUOTE (3 4))
      (MAIN LAMBDA NIL (F . ARGS))) ; Calls (F 3 4) -- Result: 25
Add MATCH for pattern matching conditionals

MATCH takes the thing to match and a list of (pattern, function) pairs.
For the first pattern that matches, the entities extracted from the
pattern will be passed as arguments to the corresponding function.

Example:

    (EVAL LAMBDA (X)
      (MATCH X (LIST
        (LIST (QUOTE (_ + _)) (LAMBDA (A B) (ADD A B)))
        (LIST (QUOTE (_ - _)) (LAMBDA (A B) (SUB A B)))
        (LIST (QUOTE (_ (\ *) _)) (LAMBDA (A B) (SUB A B)))
        (LIST (QUOTE (_ / _)) (LAMBDA (A B) (SUB A B)))
        (LIST (QUOTE *) (LAMBDA NIL (...))))))

    (EVAL (QUOTE (3 + 2))) ; Returns 5
Add option to provide a predicate for each case

Example:

    (F LAMBDA (X)
      (MATCH X (LIST
        (LIST (QUOTE (_ x _)) (LAMBDA (A B) (LEQ A B))
          (LAMBDA (A B) (ADD A B)))
        (LIST (QUOTE (_ x _))
          (LAMBDA (A B) (SUB A B))))))

    (F 1 2) ; Returns 3
    (F 2 1) ; Returns 1