Simplify fuzz testing

This implements testing of the amplifier by generating random expressions and verifying that the simplified version of that expression is equal to the original for a random sampling of values. There are also a bunch of fixes for bugs that were found by the testing.

There are a few issues to be aware of:

- It randomizes the seed for the testing, for better coverage. It also prints out the seed it uses to run the tests, so if there is a failure it can be reproduced. I'm uncomfortable with this solution, however, it has found obscure failures that were missed with otherwise very large samplings of expressions (~1 minute of runtime). We might need to move this testing to a separate test, and let it run for a long time (longer than we are willing to wait for the internal tests). It's currently set up to run a few seconds worth of fuzz tests during the internal tests.

- There are still some holes in the types of expressions that get tested. I'm thinking about ways to do more of these, but I decided to send the pull request now because of the large number of changes to the simplifier (bug fixes).
I'd like to, but unless I'm having an embarrassing brain fart, there is no way to do so while maintaining the behavior of the else branch. Notice I did it here: https://github.com/halide/Halide/pull/442/files#diff-77a4cb3680dc3c57a87fa20cfed120e9R1353 but I had to duplicate the last 2 else cases. Not so bad when it's just two simple cases, but these others require duplicating a lot more without rearranging the order of the rules, which the simplifier is somewhat sensitive to.

Also, the motivation for this pull request is that I'm going to write a pattern based rule system for the simplifier, so hopefully a lot of these huge numbers of hard-to-read ifs will go away.