librustc: Replace scope regions with SEME regions.

SEME is short for "single-entry/multiple-exit".

This patch contains no functional changes, because all intersection and
union operations on SEME regions convert SEME regions to scopes and use
the old scope-based intersection/union logic on those scopes. However,
this patch does take the full generality of SEME regions into account
when computing the gen/kill bits for the data flow analysis used in the
borrow check. Once the correct intersection and union operations land
(possibly using the dominator tree infrastructure), then non-lexical
borrows (issue #6393) will begin to work. Therefore, this patch
establishes most of the groundwork for non-lexical borrows.

Because this patch refactors the AST to index pattern arms (which is
necessary to make non-lexical borrows work in the data flow analysis for
common cases), it can break compiler plugins.