Allow primitives to be used as functions

For example, "ADD" can now be passed as an argument to a function.  When
used in this context, it will represent the function

  (LAMBDA (A B) (ADD A B))
                 ^----------- the primitive "ADD" operation

Also, when we can't find a variable definition, return an S-expression
that indicates that an error occurred and what variable was undefined:

  ( Undefined . {variable-name} )

Instead of just allowing the compiler to crash with "Attempt to CAR/CDR
an atom".
Return error code from Makefile if compile fails