pd.isna(Categorical) casts to object array
In `pd.isna`, we convert instances of `pd.Categorical` a numpy array:

https://github.com/pandas-dev/pandas/blob/07d8c2d93af3fe24f18d6c80096275de3b6794b4/pandas/core/dtypes/missing.py#L64-L65

We should be able to avoid that by calling `obj.values.isna()`, which just operates on the codes. To summarize:

- `pd.isna(Categorical(...))` coerces
- `DataFrame.isna` / coerces
- `Series.isna` / `pd.isna(series)` is fine, we handle that above
- `Categorical(...).isna` is fine

So the cases to handle:

```python
>>> s = pd.Categorical(['a', 'b'])
>>> pd.isna(s)

>>> pd.isna(pd.DataFrame({'A': s}))
>>> pd.DataFrame({"A": s}).isna()
```