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 

yeah, @pnkfelix hates it too. I don't mind it, particularly since skipping over a binder is a suspicious thing to do (and we overdo it right now, I think) and hence it's ok with me if it's kind of ugly. Still, I could rename the field to `bound` or something like that. The reason I had it as a tuple-struct was that I wanted to the short constructor and I wanted to be able to pattern match.