Change method lookup infrastructure to use the trait methods. Instead
of tracking individual candidates per impl, we just track one
candidate for the extension trait itself, and let the trait resolution
handle walking the individual impls and so forth. Also change the
interface to report back a richer notion of error.
Correct case where the old version of method lookup was incorrectly matching,
as far as I can tell.
The new method lookup mechanism typechecks calls against the method type declared in the trait, not in the impl. In some cases that results in tighter rules, and in some cases looser. Correct for that.
Test where the old infrastructure failed to detect the (applicable) impl of `FnMut` for
some reason.
Various minor cases where errors are reported in slightly different ways.
Tests for method resolution in the face of various ambiguities or non-ambiguities. These
are mostly new tests though I also revamped (and renamed) some of the existing tests.
Coherence tests that seemed to be missing.
Address nits by @pcwalton