Removed type constraint that prevented Let from being used anywhere in an expression

In particular, it was not possible to have a let expression with monadic result type.
Relaxing code motion to take advantage of the fact that expressions can now be shared anywhere
Depending on the latest syntactic that fixes a bug in code motion
Adding test cases for new forms of sharing: top-level constants and sharing in monadic code