Refactor exception classes

This refactors and improves the exception classes. Additional
documentation as well as testing has been added. This also adds
a new static method to opencl_error which converts OpenCL error
codes to human-readable strings.
Fix tests for event::set_callback() on Intel GPUs

Intel GPUs don't fire the callbacks registered with set_callback()
until the underlying OpenCL event object is destroyed. This changes
the test so that the events go out of scope or are explicitly reset
before checking that the callback has been executed.