(maint) Add Optional Type

To be able to more easily deal with undef (not matched by default
except by Data) the convenience type Optional is introduced with
the same semantics as Variant[T, Undef] (i.e. undef/nil) is accepted
instead of real type).
(maint) Add support for Optional in TypeParser and TypeFactory
(maint) Make handling of undef more strict as a type

instace? should not return true for undef for all types. This
means that [undef] =~ Array[Integer] is false. The Data type
was relaxed to still accept undef/nil everywhere except as a key in
a hash.
(maint) Make injector accept undef/nil when doing type checking

Since types are now restrictive, the injector must tolerate undef
as instance (i.e. since it means 'not found').
(maint) Fix several issues with type system implementation

The type system implementation and tests had several flaws.
* Tests did not call expect/should and did not assert
* Undef handled wrong wrt. instance_of
* String allowed parameterization with string values (useless). Can now
  instead be parameterized with a size constraint
* Collection, Array, and Hash can now be parameterized with size
  constraint.
* Data type made lenient allowing undef in constructs
Merge pull request #2194 from hlindberg/maint_undef-not-correctly-handled-in-type-calculator

(maint) undef not correctly handled in type calculator