Pass CudaTensorLayout directly to cuda kernels
Linked to #26

With the resolution of https://github.com/nim-lang/Nim/issues/6415 instead of passing rank, shape, strides, offset, data len for each tensor we can pass the C++ object directly.

This is detailed here https://github.com/mratsim/Arraymancer/blob/18fc2b6be2432e8e215e6adbead01d306f749caf/src/tensor/backend/cuda.nim#L42-L88.

This has the following benefits:

- Readability
- Register use optimization. Currently `cuda_apply3` requires 15 parameters in register. Though GPU are not as limited as x86_64 (14 registers) reducing the number needed for parameter passing will increase the number of resources for the actual computation.
- Easier to provide a C++ variadic cuda_apply template, you can just make the CudaLayout Object variadic.
