ENH: Arrow backed string array - implement factorize() method without casting to objects
xref https://github.com/pandas-dev/pandas/issues/35169#issuecomment-727217462, follow-on to #35259

This is moreless copy/paste from https://github.com/xhochy/fletcher with a slight tidy for initial review feedback

still to do

- [x] benchmarking
- [x] return type for chunked array with more than 1 chunk
- [x] maybe update tests.

we don't have failing tests, but the return type should be `Tuple[np.ndarray, ExtensionArray]` while we have  `return factorize(np_array, na_sentinel=na_sentinel)` if more than 1 chunk and the return type of pd.factorize is `Tuple[np.ndarray, Union[np.ndarray, ABCIndex]]` (mypy doesn't report this as an error since np.ndarray resolves to `Any`)

since we don't have failing tests, we probably should paramatrize data for the base extension tests with an array with one chunk and a array with multiple chunks.

cc @jorisvandenbossche @xhochy 

