Fixed using IImmutableList

Added GetOptionalTypeName(Type) helper method.
Added non-generic static class Optional with method For<T>(T value) :
Optional<T> to make it easier to create Optional<T> instances.
Changed ToImmutable() to explicitly create Optional<T> instance for each
field.
Changed DiscoverTemplateTypes to filter out non class types (useful for
creating dummy types that match actual types in same interface).
Expanded example to illustrate interface issue.

This fixes the issue of the generated ToImmutable() method being invalid
because interface typed values cannot be used as input to an implicit
conversion. This issue is still present, and using the With() method
with a variable typed as an interface will still not work - if it is
typed as an implementation of that interface it will however, as
illustrated by the various basket cases in Program.

Personally I prefer this drawback to being stuck with a specific
implementation.