Fix issue 12007 - cartesianProduct does'nt work with ranges of immutables

https://d.puremagic.com/issues/show_bug.cgi?id=12007

This makes a tweak to `Zip`'s `save`: Now, it *builds* a new `Zip` object
from the saved ranges, rather than assigning each range individually.

This gives 2 advantages:
1. Better support for `save` (which doesn't actaully guarantee assignability)
2. Avoids useless `opAssign` overhead
Simplify Zip's constructor
Merge pull request #1897 from monarchdodra/12007-2

Fix issue 12007 - cartesianProduct doesn't work with ranges of immutable...