(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.
Pushed up a fix for this. The logic became a little bit nice again.