New inference: flatten unions when solving for lower bounds
Summary:
Currently it is possible for a solution to a type variable to contain nested unions. e.g. if we have
```
int, (string | int) <: v
```
then we will solve with `v := int | (string | int)`. Also, we might end up with spurious "circular type" errors if `v` occurs somewhere in the flattened union, even though `v | t <: v` iff `t <: v`.
So before creating the union, we normalize the set of types, flattening unions, locating `null` and nullable types, and removing `v` from the set.
Reviewed By: manzyuk
Differential Revision:
D13986135
fbshipit-source-id:
847ff1083ba6501792d06e1aeb7686b066db5212