Subtype: avoid false alarm caused by eager `forall_exists_subtype`. (#48441)
* Avoid earsing `Runion` within nested `forall_exists_subtype`
If `Runion.more != 0` we‘d better not erase the local `Runion` as we need it if the subtyping fails after.
This commit replaces `forall_exists_subtype` with a local version.
It first tries `forall_exists_subtype` and estimates the "problem scale".
If subtyping fails and the scale looks small then it switches to the slow path.
TODO: At present, the "problem scale" only counts the number of checked `Lunion`s.
But perhaps we need a more accurate result (e.g. sum of `Runion.depth`)
* Change the reversed subtyping into a local check.
Make sure we don't forget the bound in `env`.
(And we can fuse `local_forall_exists_subtype`)
* Optimization for non-union invariant parameter.