_reduce needs to be defined on non-NumPy ExtensionArrays
Creating a `Series` that is not backed by a NumPy array requires the `ExtensionArray` object to implement `_reduce` to correctly delegate the method. The following method reproduces the exception:

```python
import fletcher as fr
import pandas as pd

series = pd.Series(fr.FletcherArray([1, 2]))
series.max()
```

With the respective exeception:

```
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-f77c98c78d5c> in <module>()
      3 
      4 series = pd.Series(fr.FletcherArray([1, 2]))
----> 5 series.max()

~/Development/arrow-repos-2/pandas/pandas/core/generic.py in stat_func(self, axis, skipna, level, numeric_only, **kwargs)
   9777                                       skipna=skipna)
   9778         return self._reduce(f, name, axis=axis, skipna=skipna,
-> 9779                             numeric_only=numeric_only)
   9780 
   9781     return set_function_name(stat_func, name, cls)

~/Development/arrow-repos-2/pandas/pandas/core/series.py in _reduce(self, op, name, axis, skipna, numeric_only, filter_type, **kwds)
   3251 
-> 3252         return delegate._reduce(op=op, name=name, axis=axis, skipna=skipna,
   3253                                 numeric_only=numeric_only,
   3254                                 filter_type=filter_type, **kwds)

AttributeError: 'FletcherArray' object has no attribute '_reduce'
```

To fix this bug, I would:

1. Move `Categorical._reduce` to the `ExtensionArray` interface.
2. Define a new fixture to specify the supported operations.
3. Add a new class `pandas.tests.extension.base.BaseReductionOpsTests` to verify the output of these tests.