Implement new feature to allow shuffling of Tests.

This adds new methods to Request class shuffled() and shuffledWith() which will
give a Request whose Tests will be shuffled.

This is meant as a do over for what I intended with PR #584. I believe the concerns raised in the other PR should be addressed with this new patch. The new methods shuffled() and shuffledWith() more accurately represent what is intended to happen with the Tests, as I was implementing in the other PR. Also, the shuffledWith() takes a Random which can constructed with a set seed.

Some core classes are modified, but they only add methods and do not modify any other existing code.