Struct that owns a buffer allocated on GPU device. The struct only holds the raw pointer and
length, but this struct has a Drop implementation which frees the associated device memory.
A struct that packs a pointer with a size in bytes to pass on CUDA.
It holds *const c_void for being a universal simple type that can be read by CUDA.
Since it is hard to enforce immutability preservation, it just holds *const,
but has two separate constructors for more robustness from the usage perspective.
This is essentially a DeviceBuffer but without owning the data.