Track what drop obligations are established on match arms.

This is accomplished by:

1. Add `MatchMode` enum to `expr_use_visitor`.

2. Computing the match mode for each pattern via a pre-pass, and then
   passing the mode along when visiting the pattern in
   expr_use_visitor.

3. Adding a `fn matched_pat` callback to expr_use_visitor, which is called on
   all nodes of the pattern (as opposed to `fn consume_pat`, which is only
   invoked for identifiers at the leaves of the pattern), and invoking it
   accordingly.

Of particular interest are the `cat_downcast` instances established
when matching enum variants.
Distinguish move semantics for `a @ Var(_)` from that of `Var(_)`.

Note that due to PR #16053, we only actually deal with `a @ Var(_)`
here, (as opposed to a hypothetical `a @ Var(ref b)`, which cannot
currenty arise, and maybe will never be supported for non-copy data).
Check other fields are consistent in `LoanPath::common`.
Added type fragmentation code to compute drop obligations remaining post move.

Add differentiation between assigned_fragments and moved_fragments.

Computes the fragment siblings implied by the moves and assignments,
prep to add them to dataflow inputs.

Added instrumentation to print out the moved/assigned/unmmoved/parents
for each function, factored out into separate submodule.

Add support for gathering all-but-one array fragments.
Added doc for the fragments work as it stands today.
First tests making use of the new fn move-fragments instrumentation.

The tests use new "//~| ERROR" follow syntax.

Includes a test for moves involving array elements.  It was easier
than i realized to get something naive off the ground here.