Added TraceException and FailureTraceException
Values passed to `say` are evaluated to NF, values passed to `traceM` or `traceSTM` to WHNF. If error is encountered the trace ends with with `TraceException` or simulation throws `FailureTraceException`. This is designed to give a nicer feedback on bottom values while at the same time preserve the property that such values finish the simulation. If one needs to catch exceptions thrown by `evaluate`, one can `evaluate` and `catch` within the monad before using `say` or `traceM`.