Categorical: preserve ints when NaN are present

Some fixups for Categoricals.

Fixes: #3678
this is too specific a check, instead do this:

```
dtype = 'object' if isnull(values).any() else None
values = _sanitize_array(values, dtype=dtype)
```