Add kernel for pattern matching

Finds all matches. Can tell if there is a match starting at  a
particular index.
Search algorithm

Add algorithm and test for search()
Only call clRetainDevice()/clReleaseDevice() for sub-devices
Minor fixes

Change documentation style, add test for search(), remove unused
variable, remove trailing whitespaces
Merge pull request #103 from roshanr95/search_algorithms

Search algorithm
Add algorithm and test for find_end
Merge pull request #109 from roshanr95/find_end

Find end
Add algorithm and test for search_n
Merge pull request #110 from roshanr95/search_n

Search_n
Improve reduce_on_gpu kernel if device.vendor() == NVIDIA

An internal template functor is used in order to get a clear code
when the device is from nvidia we can do:

  - loop unrolling
  - warp reduction using volatile local memory
Add device vendor predicate functions

This adds a couple new functions for checking the vendor of a
compute device. This is useful for algorithms which specialize
based on the type of the underlying hardware.
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.
Release v0.2
Creation of simple_moving_average example
creation of matrix_transpose example