REF: implement Categorical._box_func, make _box_func a method
Defining `_box_func` on `Categorical` is to facilitate more code sharing with datetimelike.  Also there are a bunch of places that do something _similar_ but slightly different that I want to standardize within `Categorical`.

Changing `_box_func` from a property-lambda to a method on the datetimelike arrays gives a slight perf boost:

```
In [1]: import pandas as pd                                                     
In [2]: dti = pd.date_range("2016-01-01", periods=3)                 
           
In [3]: %timeit dti[1]                                                          
8.73 µs ± 50.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)  # <-- master
8.08 µs ± 119 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)   # <-- PR

```
