Memoize test results
Memoize test results

Some shrinkers - notably, list shrinker from my other pull request (Fix
list shrinker) - have a huge number of possible paths to take, many of
them shared (ie. every shortening of a list eventually tests the empty
list).

This commit makes the `fuzzTest` function (which is responsible for
shrinking in case of failure, etc.) remember the test results in between
runs and reuse them when encountering the values again.

This optimization makes the fuzz tests 2x to 30x faster...

...although some care is required before merging this with regards to
bugs (does it work correctly?) and it could very possibly be refactored
some more. I expect to add more commits doing that to this pull request.

elm-community/elm-test