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.