"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.)
The idea is that `None` says that we were not able to find a list of methods valid at that point, while `[]` would indicate that the object has no methods. We could in the future print a distinct error message in that case (this object has no public methods), but more seriously I find it better style to have a type mirroring the real semantics: suggestion lists that cannot always be determined have an `option`, the one that always make sense in the current environment don't.