Implement environments

Lisp allows passing the environment around where &env is permitted in lambda-lists. Some implementations also allow access to this environment (and it's unfortunately implementation-specific, so we possibly should adopt the same API as another popular implementation for compatibility).

As curiosity I still tried printing the environment in ECL using a little trick, so it's not necessarily a very long way from being usable for the user...

(defmacro print-env (&environment env)
  (format t "~S~%" env)
  t)

(defun print-env-1 ()
  (let ((foo 1)
        (bar 2)
        (baz 3)
        (quux 4))
    (declare (type fixnum foo bar baz quux))
    (print-env)))
(((FOO NIL T (1 . 5)) (BAR NIL T (1 . 4)) (BAZ NIL T (1 . 3))
    (QUUX NIL T (1 . 2)) (:BLOCK PRINT-ENV-1 NIL (1 . 1))
    (SI:FUNCTION-BOUNDARY SPECIAL NIL (1 . 0))))
(((FOO NIL T (1 . 4)) (BAR NIL T (1 . 3)) (BAZ NIL T (1 . 2))
  (QUUX NIL T (1 . 1)) (SI:FUNCTION-BOUNDARY SPECIAL NIL (1 . 0))))

Although the same on SBCL is already more useful.