1.7x speedup of shuffle, through interface adjustments.

No change in the algorithm.

1. RandomAccessIndexType isn't really necessary for ShuffledSequence
Though RandomAccessIndexType is desirable, CollectionType's default ForwardIndexType is sufficient for the algorithm to work as written.

2. Using ShuffledSequence through SequenceOf mysteriously speeds up the algorithm by a factor of 1.4

3. PermutationGenerator is faster still, so the index shuffling was refactored into an IndexShuffler that is used by ShuffledSequence,
and can be used as an input to PermutationGenerator.

shuffle<C: CollectionType>(c: C) now returns a PermutationGenerator whose sequence of indices is generated by an IndexShuffler.

The new version is 1.7x faster than the version from the previous commit when shuffling Arrays.