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
hm thinking about it this approach does not really help as we would also need some marker to indicate that field exists.
actually that object has been extended a few times (e.g. in 1.7) so I guess nobody actually relies on its size not growing. So we could just stuff a pointer to a private object into the end.