Exercise "typed-exceptions" asked to correctly define typed
exceptions, where a thrown value is caught by the innermost catch
clause in the exception stack which has the appropriate type.  This
was quite simple to define and works fine if we are only concerned
with dynamic semantics.  However, modern languages check the correct
use of exceptions statically, and in order to do this more easily (as
well as for other reasons) they require functions to explicitly
declare the exceptions that they may throw during their
execution. This exercise requires you to change the syntax and the
semantics of the dynamically typed SIMPLE to optionally include with
each function a list of exception types that the function can throw
and not catch itself.  For example:

void f(int x) throws int, string {
  try {
    print(x, "\n");
    if(x >= 3) {
      throw -1;
    } else {
      if(x <= 1) {
        throw "error";
      } else {
        throw true;
      }
    }
  } catch(bool b) {
    print("Bool thrown.\n");
  }
  print("Wrong.\n");  // should never reach this
}
