> The fact that `ref` in foreach binds to rvalues is a bug in the design of D.

All code that does that is wrong. We should break it and replace it with an `auto ref` feature instead.

> Existing form is a tad better because it doesn't create a copy in certain cases.

It also doesn't create a copy of `range` when it's a `ForwardRange`, though it seems here that might actually be desired (not currently done).