Rewrite associated types to use projection rather than dummy type parameters

Rewrite associated types to use projection rather than dummy type parameters. This closes almost every (major) open issue, but I'm holding off on that until the code has landed and baked a bit. Probably it should have more tests, as well, but I wanted to get this landed as fast as possible so that we can collaborate on improving it.

The commit history is a little messy, particularly the merge commit at the end. If I get some time, I might just "reset" to the beginning and try to carve up the final state into logical pieces. Let me know if it seems hard to follow. By far the most crucial commit is "Implement associated type projection and normalization."

r? @nick29581 

aside: I find this pattern of using `.0` to get the inner type of a named tuple really, really ugly. It would be much clearer to make Binder a proper struct and name the field or make it a type alias if we must - the `0` is just confusing line noise. (I don't expect you to fix this here, just having a rant)