more small-array performance improvements

some more small array performance improvements, please see the commits for details.
The changes are somewhat hackish and could probably also be resolved by a more extensive overhaul of the ufunc object, though these changes are also very simple and should we decide to do an overhaul its good to have a better performance in our benchmarks for comparison.

small reductions (O(100) elements) improve on my machine by ~20% and binary ufuncs by about ~10%.

* `add.reduce(ones(100))` from 1.80us to 1.5us
* `add(ones(100), ones(100))` from 0.77us to 0.7us
Can we do this in a cleaner way? E.g.
```
typedef struct {
    PyUFuncObject public;
    /* extra fields here */
} PyUFuncObjectPrivate;
```

and then they can be cast back and forth to each other so long as we're careful to always allocate the full thing? (This does assume that subclassing ufunc is illegal though.)

Or if that's not doable for some reason, at least a few helpers to get/set this table?