Implement the `Fn` trait for bare fn pointers in the compiler

Implement the `Fn` trait for bare fn pointers in the compiler rather
than doing it using hard-coded impls. This means that it works also
for more complex fn types involving bound regions.
Why the `let () =`?