Parametrized NA sentinel for factorize
Adds a new keyword `na_value` to control the NA sentinel inside the factorize
routine.

```python
In [3]: arr = np.array([0, 1, 0, 2], dtype='u8')

In [4]: pd.factorize(arr)
Out[4]: (array([0, 1, 0, 2]), array([0, 1, 2], dtype=uint64))

In [5]: pd.factorize(arr, na_value=0)
Out[5]: (array([-1,  0, -1,  1]), array([1, 2], dtype=uint64))
```

The basic idea is that our hashtables now have two "modes" for detecting NA values

1. The previous way, based on the templated na_condition
2. Equality to a user-specified NA value.

Note: specifying NA value does not "turn off" the old way of checking NAs.

```python
In [2]: pd.factorize(np.array([0.0, np.nan, 1.0]), na_value=0.0)
Out[2]: (array([-1, -1,  0]), array([1.]))
```

I'm sure the implementation can be cleaned up, but I wanted to put this up for feedback. Hopefully someone can tell me how to avoid the `use_default_na` nonsense :)

cc @WillAyd

closes https://github.com/pandas-dev/pandas/issues/20328