PERF/DISC: restrict inputs to is_foo_dtype
xref #33364

A lot of the overhead in is_foo_dtype (which we call _a lot_) comes from checking for dtype objects, arrays, and strings.  We could tighten these to be e.g.

```
def is_extension_arrray_dtype(obj):
     return isinstance(obj, ExtensionDtype)
```

The trouble with this is some of these are user-facing, so this would require a deprecation cycle, and in the interim the `warnings` call would actually hurt performance.