SI-6925 use concrete type in applyOrElse's match's selector

Fix a regression introduced in 28483739c3:

PartialFunction synthesis was broken so that we'd get:
```
scala> def f[T](xs: Set[T]) = xs collect { case x => x }
f: [T](xs: Set[T])scala.collection.immutable.Set[_ <: T]
```

rather than
```
scala> def f[T](xs: Set[T]) = xs collect { case x => x }
f: [T](xs: Set[T])scala.collection.immutable.Set[T]
```
rework partial function synthesis

no behavioral changes, just highly overdue cleanup
some TODOs for further improvements