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

The fix consists in making Repeat!T assignable, even if T itself is not.
Mark std.stdio.File.this(this), isOpen, name and getFP as `@safe`
Fixup sum documentation
Merge pull request #1968 from monarchdodra/issue12169

Fixup sum documentation
Merge pull request #1964 from tom-tan/safe-some-methods-std-stdio

Mark std.stdio.File.this(this), isOpen, name and getFP as `@safe`
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...
Merge pull request #1895 from monarchdodra/12007

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