(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.
since the parameters attribute is always an array it alone cannot tell the difference between user having defined no parameters, or if there was no statement about parameters at all. That is what the parameters_specified flag is for (it is set by the parser depending on if an EPP templates defines parameters, or is completely without).