Initial add of the generic optimizer code

Before digging into this code, look at the Rules implemented at the bottom of DagOptimizer.

There are several TODOS here:

- [x] After I split the code into separate files, I started hitting a scala 2.9 compiler bug, that I don't hit in 2.10. I'll try to work around, or possibly hope that Twitter finally gets on 2.9 before we need this.

- [x] Tests tests tests. I played around at the repl, but clearly we need super hardcore tests for any optimization framework.

- [ ] Actually call this code from an existing platform.
I meant in the sealed trait... but yeah, you don't get a win in this piece of the code, only above potentially. Although if you add it to the sealed trait Expr, you might be able to do:

```
private def evaluate[T, N[_]](expr: Expr[T, N], idToExp: HMap[Id, expr#E],
    cache: HMap[expr#E, N],
    expr: Expr[T, N]): (HMap[expr#E, N], N[T])
```