Consolidating forward range requirements

Because returning anything other than an *exact* type match messes everything up. This is particularly true in the sense that "saved" ranges are usually passed directly to a function, so not cast back to the original.
Merge pull request #1008 from monarchdodra/save

Consolidating forward range requirements