Improve `Enum.reverse_slice/3` performance and more

__[1,2,3,...,10], 3, 3__:
```
EnumReverseSlice.new:   10000000   0.50 µs/op
EnumReverseSlice.old:   10000000   0.95 µs/op
```
__[1,2,3,...,100], 3, 3__:
```
EnumReverseSlice.new:    1000000   2.64 µs/op
EnumReverseSlice.old:     500000   6.99 µs/op
```
__[1,2,3,...,100], 25, 25__:
```
EnumReverseSlice.new:    1000000   2.88 µs/op
EnumReverseSlice.old:     200000   8.16 µs/op
```
__[1,2,3,...,100], 40, 40__:
```
EnumReverseSlice.new:     500000   3.18 µs/op
EnumReverseSlice.old:     200000   8.21 µs/op
```
__[1,2,3,...,10_000], 10, 300__:
```
EnumReverseSlice.new:      10000   252.78 µs/op
EnumReverseSlice.old:       2000   887.39 µs/op
```
__1..100, 3, 3__:
```
EnumReverseSlice.new:     100000   15.42 µs/op
EnumReverseSlice.old:     100000   22.38 µs/op
```
__1..100, 25, 25__:
```
EnumReverseSlice.new:     100000   16.25 µs/op
EnumReverseSlice.old:     100000   22.67 µs/op
```
__1..100, 40, 40__:
```
EnumReverseSlice.new:     100000   15.60 µs/op
EnumReverseSlice.old:     100000   23.28 µs/op
```
I've checked this consideration before the PR for lists and ranges: 1..10, 1..100, 1..10000.
`reverse_and_count` drastically degrades performance for lists and slightly drops for other collections.