Type-based alias analysis actually works now

Turns out the types had to have the same root node to be compared.
Don't lift cast nodes out into let statements

It breaks peephole matching that assumes cast nodes will be in place.
Expose the remove_lets method from CSE

May be useful as a prepass to peephole matching during codegen.