Macros: Make map more lispy
Macros: Make map more lispy

I've updated the implementation of map to make it similar to
implementations in other lisps. Calling map either calls an
implementation of the traditional `map` if a single list is provided as
an argument, or to `zip/zip-with` if multiple forms are provided as
arguments.

In order to facilitate this implementation, I've also implemented
several utility functions:

empty?: returns true if a data literal is empty.
and-internal: boolean and (the prior and macro doesn't work for our
purposes because it returns a form).
or-internal: boolean or, ditto regarding the existing or macro.
apply: applies a function to a list of arguments.
zip-internal: the implementation of zip-with we use in map.
reduce: works in the traditional way, folds a list of values into a
single value using a binary function and some initial value.

eriksvedang/Carp,carp-lang/Carp,carp-lang/Carp,carp-lang/Carp,eriksvedang/Carp