Re-implement reduce

Instead of writing a brand new "fold", I integrated my code in reduce. Now, fold/reduce will be simply implemented in terms of one-another.

Advantages of the new code include.
* Clearly separated seed/no-seed overloads, with named variables.
* Precise and more formal documentation/spec. reduce's behavior up until now was obscure at best.
* More consistent behavior depending on cases (see issue 10709)
* More robust seed inference/validation.
* Code is smaller and (IMO) cleaner and more straight forward to grok.

I don't recommend trying to look at a diff directly, it's an complete re-write.