Add RefinedType to track types more accurately.

In particular, we track whether:
* the type is exact, i.e., the value is of that particular class, not any of its subclasses
* the type is nullable.

The former is mostly useful for determining the target of
a dynamic call: if the type is exact, we can perform the
lookup as if it were a static call, which always gives 1
target, which means more inlining is possible.
My bad. I thought you almost always use `LocalDef` with a refined  that is exact and not nullable. But there are too many other cases, so an apply that takes just a type and makes the exact, non-nullable refined type is probably too confusing.