Throw More Specific Error Messages

This change tries to substitute generic uses of error for more
specific error messages.  Two new Error Objects were introduced.
OpenCL.OpenCLException is for generic library runtime errors.
OpenCL.CLMemoryError is for possible double free events of subtypes
of CLMemObject