add range version of setExtension

This adds an overload of setExtension() that writes to an OutputRange rather than using the GC to allocate a buffer. I'll do more range-ifying of std.path once this is pulled, as this is a prototype.

Not really sure if I have the optimal order of the parameters - should the OutputRange be the first or the last parameter?