Implement parsing and conversion of generalized where clauses

Going to tentatively open a PR before I move on to other things tonight. I think everything should be good minus a failing test case for region bounds (gonna push that now, i.e 'a : 'b). r? @nikomatsakis 
Can you (1) enumerate the cases that are not handled, (2) put FIXME(#20023) (or open a new issue if appropriate), and (3) call `this.tcx().sess.span_bug(predicate.span, "Such and such constraints are not yet implemented (#20023)")` instead of just panicking?