Use new cartesianProduct implementation for 2-argument case as well.

The original implementation will now only be used when one or both the
ranges is either non-forward or infinite. The new implementation is also
more attribute-friendly (works with pure, nothrow, @nogc, @safe), so
this also fixes issue 13091.
Bug number shouldn't appear in ddocs!
Merge pull request #2534 from quickfur/issue13091

Use new cartesianProduct implementation for 2-argument case as well.