Provided two composite types, determine if they “overlap”. Two composite
types overlap when the Sets of possible concrete types for each intersect.
This is often used to determine if a fragment of a given type could possibly
be visited in a context of another type.
This function is commutative.
Extracts nested NamedType from a potentially recursive wrapped definition.
Example: Returns String from String or String!