"Hint: Did you mean" simplified and expanded

This pull-request refactorizes the current implementation of the "Did you mean?" feature, and extends it to several use-cases not previously covered. Some (or-patterns) are anecdotal and were done to test the generality of the new interface, but I expect having the availability of "Did you mean" for typos in method names to give significant usability improvement for some users.

The general philosophy of the patch is to change the exceptions raised whenever the information required to give hints is easy to access at the exception-raising site and hard to access outside it. (By comparison, previous use-cases only relied on the typing environment being available at the error-printing site, so had an arguably more uniform implementation.)
Do we need a `string list option` here? Wouldn't the empty list be treated the same as `None`?