refactored expressions into a strongly typed GADT

in preparation for a Whenever -> C compiler