libviennacl: Cleanup: Applied pimpl-idiom to separate implementation from viennacl.hpp

This way one can keep viennacl.hpp unchanged and deal with all the details internally.
Host/CUDA/OpenCL backends are no longer globally visible, but instead hidden in a common backend.
Backend objects are now explicitly created and destroyed, added minimal API for this.