BUG: fix CategoricalBlock pickling

This should fix #8518.

Apparently, `NonConsolidatableMixIn.__init__` was copied from a pre-`BlockPlacement` version of `SparseBlock.__init__` which was incompatible with placement being a slice.  The current one is, so I moved it to NonConsolidatableMixIn class almost verbatim.
ok, except the tests in categorical use ``self.assert_categorical_equal`` (easiest to maybe define this in ``utils/testing/TestCase`` to call this is ok too