Fix Issue 9456 -  decodeFront is inconsistent in whether it pops elements off of the range or not 

`decodeFront` was popping off elements from reference type ranges and input ranges but not other types. Ideally, it would act like `decode` and not pop any elements off of any range, but that doesn't work with input ranges. So, in order to keep it consistent, `decodeFront` now takes its range by `ref` and always pops off the code units that it decodes.

Also, the tests have been improved for `decode`, `decodeFront`, `stride`, and `strideBack` so that they test more range types (including reference types ranges).