Rename `environment::set` to `add`.
Add `set!` builtin
Add test for `set!`
Implement `begin` builtin

`begin` accepts a variable number of arguments so we had to restructure
a bit:

* A call can have either a list of formal argument names or one name
  which names the (arbitrary length) list of arguments. This is
  implemented as a `variant`, with a static visitor deciding how to
  treat the arguments upon invocation.
* Break up `list` constructor to allow a range-copy constructor which is
  needed to copy the variable-length parameters.
* Disambiguate between `macro` constructions which take a single
  argument and those taking a *list* argument.