Custom reduction is a binary operators, but differs from the existing

sparse_tensor.binary operation in significant ways.

- It does not deal with sparsity overlaps. It is given a finite set of non-empty values and must collapse them to a single value
- The nature of reduction requires a starting value (or identity value). This is normally zero for summation, but for the product needs to be 1.0. The custom code needs to explicitly pass an identity value.