Optimize Condition and Switch

This PR adds optimizations to Condition and Switch. It is a workaround / partial fix for Feldspar/feldspar-compiler#126.

For Condition it adds propagation of information from the condition expression into the branches. Currently the propagation is limited to the cases when the condition expression is either a variable or an equality where one of the expressions is a variable.

For Switch it will eliminate any Switch that does not contain a right-spine condition tree and turn it into just an expression.

@emilaxelsson, how do you feel about exposing `subst` for this?