ENH: change the category type to use unsigned int for the internal pointers
#### Is your feature request related to a problem?

It seems that the current implementation of the category type is using signed int for the pointers per item.
Thus, it will take 2 bytes (int16) per item as long as the number of unique items is less then 32K, then it goes up to 4 bytes per item. 
Since there is no need for the sign here, we could use unsigned int (uint16) and have the pointers at 2 bytes for up to 64k unique items.
the same is true for moving from 1 byte to 2 bytes, or from 4 bytes to 8 bytes.
This can save a lot of memory for very large dataframes which use category types extensively.

#### Describe the solution you'd like

change the internal pointers to use unsigned int.

#### API breaking implications

n/a

#### Describe alternatives you've considered

n/a

#### Additional context

