SI-7475 use intersection type for pattern type

Usually, the type of a pattern binder is an intersection of
the scrutinee type and the pattern type.

We used to "simplify" this intersection to eliminate
"redundancies", so that `intersect(Sub, Super)` will just
be `Sub` (where `Sub` <:< `Super`).

But, if we are nested in `Super` there is an observable difference
between `Sub` and `Sub with Super`. Only the latter will allow
use to select private members of `Super`.

By removing the simplification, a bug in tailcalls was discovered:
it should only look at erased types, because the full Scala types
are irrelevant to execution.

For example, given `class A; class B extends A`, it would consider a
call on `A with B` different from a call on `B`. If the calls type check
for both targets, they can't dynamically be calling different methods.