(PUP-1619) Add first impl of working Tuple Type

This adds the Tuple Type which is parameterized with a sequence
of types. The parameters also includes the ability to specify a range
of occurrences of the last type in the sequence (default 1).

This also makes a small refactor of type equality since Tuple and
Array may describe exactly the same type of instance, but it is
neither's responsibility to know this - hence, equality of types
is now performed by the TypeCalculator.

This commit also contains the model part of the PStructType
implementation.
(PUP-1619) Fix problem with parsing Tuple

There was a problem parsing the occurence constraint for the
last type argument (if there was one numeric).

This also adds a test.
(maint) Add Array type size constraint test

A test for Array[T, from, to] was missing.
(PUP-1619) Add more tests of Tuple Type
(PUP-1619) Make Tuple a subtype of Data when its elements are Data
(PUP-1619) Add support for a Struct Type

The Struct Type fully qualifies a hash.
Keys must be non empty Strings. The type of the value is specified
per key.
(PUP-1619) Accept missing struct keys if type for key is optional

A hash with key bound to nil/undef or missing key and the 
struct type accepts nil/undef should be treated as matching.

Without this fix, the hash must has nil/undef bound to keys witout
value.
(maint) Fix issue with type_of not handling Optional type

The Optional Type was treated as a RubyType in the type_of method
because it checked against ObjectType instead of AbstractType.
(maint) Correct indentation in type parser
(PUP-1619) Add support for Struct in Type Parser
(PUP-1619) Add tests and fix issues in type parser

The type Optional had no tests in type parser. Tests also
added for the new types Tuple and Struct.

Also fix issues with Optional type handling in type calculator and type
factory.
(maint) Fix regexp with unescaped { causing warning when running tests
(PUP-1619) Fix problems with Ruby 1.8.7 Range min/max & Infinity

Billions of blue blistering boiled and barbecued barnacles, the
Ruby 1.8.7 implementation of Range min/max is based on Enumeration.
This does not work well when the range has +/- Infinity at one of
the ends. There is probably a "break" when it reaches Infinity...

*sign*

This commit changes the implementation from using a Range to using
an Array instead of a Range.
Merge pull request #2345 from hlindberg/pup-1619_add-struct-tuple

(PUP-1619) add struct and tuple types to type system
Merge branch 'master' of https://github.com/puppetlabs/puppet