GpuEventSynchronizer: extract backend-specific functionality
No new functionality or added checks.
Preparatory work for adding advanced event accounting logic to GpuEventSynchronizer.
DeviceEvent class contains only backend-specific functions and minimal sanity checks. The more advanced logic (the one we're trying to fix in #3988) is kept in GpuEventSynchronizer, and currently left unchanged (1:1 for OpenCL and SYCL, very relaxed rules for CUDA).
Light-weight version of !1205 (closed) to facilitate !1832 (merged).
Edited by Andrey Alekseenko