make packet processing pipeline configurable

this PR allows to pass a PacketPipeline object to the Freenect2::openDevice(...) methods. This object is responsible for creating the objects, which do the raw usb data parsing and the decoding of rgb and ir/depth images. This allows users to change the default data packet parsing and image decoding routines without changing the libfreenect2 source code.  Furthermore, they can change the threading model. It is even possible to use a different pipeline per device. Another use case might be to simply dump the raw data to disk.