librustc: Fix up mutability in method autoderefs if incorrect, and

prefer `Deref` over `DerefMut` in all other circumstances.

Because the compiler now prefers `Deref`, this can break code that
looked like:

    let mut foo = bar.borrow_mut();
    (*foo).call_something_that_requires_mutable_self();

Replace this code with:

    let mut foo = bar.baz();
    (&mut *foo).call_something_that_requires_mutable_self();

Closes #12825.

[breaking-change]

r? @nikomatsakis
This loop should also consider recurse on field accesses and indexing, I think, and consider autoderefs on those expressions we pass through. This is why expressions like `guard.access.pending.remove()` require an explicit `&mut` (which I think they should not).