[LibFuzzer] Avoid using std::random_swap() due to platform differences
and implement our own version.
It turns out that the behavior of std::random_swap is different between
libstdc++ and libcxx (even with the same random number source).
Therefore if we want consistent behavior between platforms we have to
use our own implementation.
This change (plus a change to the number of iterations of the Mutator in
the test required for the particular shuffle implementation used) fixes
the `FuzzerMutate.ShuffleBytes2` unit test on OSX.
I have verified that for the above unittest identical mutations are
now generated on both Linux and on OSX.
Specify algorithm reference.