What's the difference between `T: Trait + 'a` and `impl Trait + 'a`?

The difference are different types. When you write T that means… well, T.

When you write impl Trait in return position then creates something Haskell calls an existential type: that may still be T, under the hood, but you are not permitted to use that.

The rest of your code may only use functions from Trait and, if you added + 'a or use<T> it would be able to use for 'a (or for as long as T exists).

Because reference to type may have smaller lifetime than type itself (trivial example: i32: 'a for any 'a) impl T + 'a and impl T + use<T> are usable for a different lifetimes (that's actually why new use<T> syntax exists, before it's introduction there was not possible to express that desire).