Redesigned mask matching engine

This manages to flatten the validation process (as opposed to the
previously recursive approach) which allows the validation of large
arrays and objects without causing RangeErrors. In addition to this,
I've added the ability to (by default) output the available overloads
for a function when it is called incorrectly - this requires a few small
changes to the way in which handlers are registered (i.e. providing a
name for every handler) but overall I think it's worth it from a
usability perspective.
2.0.0