Throw an exception object instead of string.

Overload stringification so printed error message is same as before, but, if
these exceptions are being caught during run time, the list of best matches
can be examined in the exception handler.

Removes the need for a global variable.

I am not sure if there is another consideration that necessitated the use of 
`$DYM_MATCHING_SUBS`. If that's the case, feel free to ignore this.