WIP: categoricals as a ninternal CategoricalBlock GH5313

This PR creates a ``CategoricalBlock`` as a first class internal object, on par with blocks like ``Datetime,Timedelta,Object,Numeric`` etc.

This allows inclusions / manipulation in a nice way fully supporting almost all pandas operations.

ToDO:

more tests for 
- [ ] concat
- [ ] astype
- [ ] sorting/slcing

- [ ] docs/release notes
- [ ] try to use ``get_values()`` in ``DataFrame._sanitize_columns``

closes #5313
closes #5314
closes #3943

Example of usage
```
```