COMPAT: Categorical Subclassing
- [x] related to #8640
- [x] tests added / passed
- [x] passes `git diff upstream/master | flake8 --diff`

It allows to subclass `Categorical` related to #8640.  Shoud it use `_simple_new` or `_constructor`?

## [Current coverage](https://codecov.io/gh/pydata/pandas/pull/13827?src=pr) is 85.28% (diff: 94.73%)

> Merging [#13827](https://codecov.io/gh/pydata/pandas/pull/13827?src=pr) into [master](https://codecov.io/gh/pydata/pandas/branch/master?src=pr) will decrease coverage by **<.01%**

``` diff
@@             master     #13827   diff @@
==========================================
  Files           139        139          
  Lines         50057      50062     +5   
  Methods           0          0          
  Messages          0          0          
  Branches          0          0          
==========================================
+ Hits          42692      42695     +3   
- Misses         7365       7367     +2   
  Partials          0          0          
```

> Powered by [Codecov](https://codecov.io?src=pr). Last update [45d54d0...13c456c](https://codecov.io/gh/pydata/pandas/compare/45d54d067ed9a0dfdb456f253fb0bede9969187c...13c456cfd804675c8b14fa79cc830ff8952b1e9e?src=pr)
 The changes in this PR are fine, but I'm not sure it's a good idea to subclassing Categorical in the API, though I would guess nothing major is likely to change before v2.0. `Categorical` is diving pretty far into pandas internals.
 It may better to discuss in #8640, I' m thinking the following stricture:
- CategoricalMixin ( move internal methods related to `_categories` and `_codes`)
  - Categorical (no API change)
  - String (automatically handle `_categories`, `_codes` and `.str` methods)

I don't think we have to wait for 2.0 as long as it does't break existing user's code, but it also should be discussed separatelly (in ML).
 Updated to use `_constructor` and added small number of tests.
 ty!
