Permit perfect forwarding for `Fn` traits

Rewrite how the HRTB algorithm matches impls against obligations. Instead of impls providing higher-ranked trait-references, impls now once again only have early-bound regions. The skolemization checks are thus moved out into trait matching itself. This allows to implement "perfect forwarding" impls like those described in #19730. This PR builds on a previous PR that was already reviewed by @pnkfelix.

r? @pnkfelix 

Fixes #19730 
Since you just defined the taint set, it is worthwhile to write what it is explicitly here, in the same way that you write it out explicitly in the `StaticInt` example below.  i.e. "In this case, the taint set is `{ '0, '$a }`, which has no skolemization leaks, and thus the match is a success."  (At least, that's what it seems to me like the taint set should be, from the description given.)