optimizer: reduce constants to #t/#f in boolean contexts

While something like `(if 7 e1 e2)` was already reduced to `e1`,
this improvement makes `(if (let ([x (random)]) 7) e1 e2)`
reduce to `(if (let ([x (random)]) #t) e1 e2)`.
optimizer: local known to satisfy predicate => #t in a boolean context

For example, `(if (pair? x) (if x e1 e2) e3)` => `(if (pair? x) e1 e3)`.
optimizer: unwrap `let` and `begin` around constant test in `if`

Takes advantage of Gustavo's improvements