PointerIntPair and PointerUnion already mostly support nesting pointer-like types, but support was incomplete. PointerUnion::isNull still assumed that a union member was a true C++ pointer type. The meaning of PointerUnion::isNull is that the nested pointer component is null regardless of any other spare bits recursively. To adhere to the original intention of this API and fully support nested pointer types, we PointerLikeTypesTraits needs a new isNull() static method.
Once we have PointerLikeTypesTraits::isNull(), it's easy to make TinyPtrVector generic over pointer-like values. We just call isNull instead of assuming that pointer-like things are convertible to bool
Note that we don't actually want all pointer-like things to be convertible to bool because that's ambiguous for PointerIntPair.