JIT: modify how jit determines when to update a type (dotnet/coreclr#22618)
For single-def locals, the type of a reference seen at the assignment to the
local may be a more specific type than the local's declared type. If so the jit
would prefer to use the assignment type to describe the local's value, as this
will lead to better optimization. For instance in
```
object x = "a string"; // only assignment to x
```
the jit can optimize better if it models the type of `x` as `string`.
Instead of relying on `mergeClasses` plus some jit-side screening to decide if
the assignment type is a more specific type, implement a new jit interface
method `isMoreSpecificType` that tries to answer this question more directly.
Added a test case with type equivalence that hit asserts.
Closes dotnet/coreclr#22583.
Commit migrated from https://github.com/dotnet/coreclr/commit/
bb62718325435a1ad5761c84c06b8b653856e296