refactor cudaEvent usage

- add `CudaEvent` which is a wrapper for cudaEvent_t
- solve problem that `cudaStreamWaitEvent` was called to often
- EventStream: add function `waitOn(CudaEvent)`

This pull request minimize the overhead of the event system. (~ 3-5%)
does it make sense to return a reference to the internal struct here? especially since it is passed to `waitOn` later on