Fix #7426, StepRange iteration bug

The integer-only definition parallels what we have for StepRanges and seems to work quite well for all cases but `typemin(Int):1<<n:typemax(Int)`. As a benchmark, I used:

```julia
function f(a)
    z = 0
    for x in a
        z += x
    end
    z
end
@time f(0:5:10000000000)
@time f(0:5:10000000000)
```

On my system, the method in this PR is 1.6x faster than the existing method and also fixes #7426.

As far as `typemin(Int):1<<n:typemax(Int)`, this might be a little better than before, since `[typemin(Int):1<<n:typemax(Int)]` returns uninitialized memory instead of segfaulting, but we should probably throw an error for this case in the constructor.

I'm less sure what should be done with non-integer types, which in theory StepRange supports. The definition I've added here can handle both wrapping and the possibility that iteration might not actually hit `r.stop+r.step`, (which the integer-only definition cannot). However, it could be expensive for arbitrary types if the `isempty`, `min`, and `max` operations can't be hoisted outside of the loop. The integer-only definition is not especially necessary, but it is slightly faster (1.5x instead of 1.6x).