Support Sized bounds for associated types

This also refactors associated types in various ways, most notably by moving the associated types defined in a trait into their own param space which replaces the associated-types hashmap (which is just removed). We should probably move the synthetic type parameters into yet another namespace, but that can wait.

Fixes #17921 
Can we make this return a struct instead?