BUG: Series.map may raise TypeError in Categorical or DatetimeTz
- [x] closes #12473
- [x] tests added / passed
- [x] passes `git diff upstream/master | flake8 --diff`
- [x] whatsnew entry

Needs to decide what categorical dtype `map` should return. Even though `apply` returns `object` dtype, but returning `category` is more consistent?

Let me confirm the result of `map/apply` against categorical dtype. I think there are 3 options.
1. Keep categorical dtype. If number of category is changed, raise error.
2. Coerce to normal (`object`) dtype befoe `map/apply`
3. Try 1st option, then 2nd option if catches error

and current impl are as below and has inconsistencies. I think option #1 is preferable.

### map (option 1)

It raises `AttributeError` on current master.

```
s = pd.Series([1, 2, 3], dtype='category')
s.map(lambda x: x)
# 0    1
# 1    2
# 2    3
# dtype: category
# Categories (3, int64): [1, 2, 3]
```

### apply (option 2)

no changes from current master

```
s.apply(lambda x: x)
```
 yeah I think if you can construct a `category` with exactly the same dtype (IOW, categories & ordered) then do it. Otherwise just coerce to `object`.
 @jreback OK, both categorical `apply/map`  are fixed to return `category` if possible, otherwise coerce to appropriate dtype.
 @jreback Because #12798 relies on this, can we consider to merge this in prior to fixing whole `Index.map` API ( #12756)? 
 this looks fine. maybe we can come back and try to simplify logic even more w.r.t. the extension types. 

we have lots of if/then's handing around extension/ndarrays. An idea (maybe not trivial), is to have an `Array` internally which is really an extension type that simply passes thru everything, then we can define all of the methods on this type (and just pass thru everything else), e.g. `map`, `.value_counts` etc. This gets into `libpandas` territory (well it actually makes it simplerI think) as everything would then have a uniform API (from pandas perspective). The implementation can then be different.

But that's for another day.

@kawochen any comments on this code?
 this lgtm. pls rebase
 Rebased and now green.
 thanks!
