Fixed issue with releasing async events.

Errors on waiting for and releasing already-finished events were
stopping things. Instead, we'd rather ignore errors on such events.
Add runCLIO for easier cleanup.

Unwrap the cleanup action from runCL into a plain IO action. This makes
the type less informative, but means the caller can be completely
oblivious to OpenCL.