FFT optimizations/bug fixes

This pull request contains a bunch of optimizations to the FFT, as well as some optimizations/bug fixes I found in Halide while working on this.

Some notable changes are:

- Simplification rules for (x - y)*-a -> (y - x)*a, this is helpful to optimize complex multiplications that arise in the FFT frequently.
- Simplification for constant ramps modulo constants.
- More aggressive simplification of nested ifs with redundant conditions.
- Folds adjacent ifs with identical conditions (and fixed bug found in IREquality for blocks when writing unit tests for this).
- Added vector of Var/Expr parameters to Func::operator(). This helps support situations where placeholders don't work because the pure definition is undefined.
I'd rather not do this as I want to move all of these repetitive operator() decls to using variadic templates. (We'll leave in six of them per use for pre-C++11 for a fair bit of time of course.) I expect this is doable, but it seems a bit messy and I'm not sure I like the way it works. It also means every Func application is making an empty std::vector and that is not without cost.

I'm trying hard not to be knee jerk negative, but this feels wrong to me. E.g. if it were to behave like rest arguments, where the last item is available as a single thing on the right hand side, it might make more sense. Also I think this is motivated by working around an issue with using plain underscore and maybe there is another approach to that, such as a type of Func definition that only sets the number of arguments, and lets the expression for the pure definition happen later.