Start restructuring to support generalized where clauses etc.
Thread a id to `Obligation`
Move the list of region obligations into the fulfillment context.
Introduce predicates but don't use them.
Write code for registering region obligations (but don't use it yet).
Switch to using predicates to drive checking. Correct various tests --
in most cases, just the error message changed, but in some cases we
are reporting new errors that OUGHT to have been reported before but
we're overlooked (mostly involving the `'static` bound on `Send`).
Remove diagnostic errors that were yielding warnings.
Fix the opt-out-copy behavior so that values with dtor etc are considered affine
Implement the astencode rules for predicates. These don't actually get
used by trans, but it's easy to do.
Improve comments and address nits.
auto merge of #19683 : nikomatsakis/rust/generalized-where-clauses, r=nrc

This patch does not itself enable generalized where clauses, but it lays the groundwork. Rather than storing a list of bounds per type parameter, the trait selection and other logic is now driven by a unified list of predicates. All predicate handling is now driven through a common interface. This also fixes a number of bugs where region predicates were being dropped on the floor. As a drive-by, this patch also fixes some bugs in the opt-out-copy feature flag.

That said, this patch does not change the parser or AST in any way, so we still *generate* the list of predicates by walking a list of bounds (and we still *store* the bounds on the `TypeParameterDef` and so on). Those will get patched in a follow-up.

The commits in this case are standalone; the first few are simple refactorings.

r? @nick29581 
cc @aturon