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 
As written it is not clear that the `'a` being referred to is implicitly bound to one particular lifetime, namely `'static`.  This should be rewritten as "only implements Foo<&'a int> where 'a == 'static".  Or "only implements Foo<&'static int>` if you prefer.