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 

I like to do that to assert that there is no returned value I should be consuming here. I admit I do this at sort of random times -- in this case, it is because some of the `assemble_candidates_*` methods return errors or useful data, and some do not.