(PUP-514) Add support for optionally typed parameters.

This adds optional type annotations to Classes, Defines, Lambdas, and EPP
templates. The types available are (not an exhaustive list) Integer, String,
Object, Variant[x, y, ...], Optional[x], Type[x], etc. Variant is a union type
that allows specifying that the allowed type is any one of the given types.
Optional is needed to allow undef (type Undef) to be used since the standard
types (String, Integer, etc.) do not allow undef to be assigned. This means
that Undef is not a bottom type.

Epp templates do not support "captures rest" arguments (`*$x`) and so there is
now a check to issue an error when that is encountered.
Er, um.  So, if I'm understanding this bit, we're passing along the same scope we received, but first, we're marking the old ephemeral scope, creating a new ephemeral scope with the variable bindings relevant to the closure based on the scope we were given, and then ensuring that we reset to the previous ephemeral scope when all is said and done?