Fix regression with data declarations in where

Also, start adding tests for examples from the tutorial (we need to
cover it all, really).
Add with_val and pureM syntax

Allows updating the set of effects based on a declared return value
(pure is not quite enough for this: we need to provide the return value
then a program which updates the set of effects/states to justify it
being a value return value!)

e.g. (somewhat contived, but...)

  readInt : { [STATE (Vect n Int), STDIO] ==>
              {done} if done then [STATE (Vect n Int), STDIO]
                             else [STATE (Vect (S n) Int), STDIO] }
                             Eff IO Bool
  readInt = do let x = trim !getStr
               if (x == "END")
                  then pureM True
                  else do putM (cast x :: !get)
                          pureM False

pureM x is equivalent to with_val x (pure ())