Interpreter.Interpret: introduced the 'Interpreter' monad

Rationale:
  - I want to take the all too general IO actions out of the
    interpreter and allow more finegrained control of side effects.
    This does not only make the code easier to understand, but
    would also allow for safely running instances of the interpreter
    in exposed environments like a live demo on a public website.