add range version of setExtension

Since Walter is being unresponsive, I'm hijacking his [original PR](https://github.com/D-Programming-Language/phobos/pull/2149). This PR basically uses Walter's code as base, and adds some fixes on top per reviewers' comments.
How about `chainExtension`?  `chain` already means 'lazily concatenate' in phobos, while 'with' means very little in this context.