Extend gpu_only_cc_library to handle backend specific targets
Extend gpu_only_cc_library to handle backend specific targets

Example:
```
gpu_only_cc_library(
  name = "target",
  cuda_srcs = [ "target_cuda.cc" ],
  rocm_srcs = [ "target_rocm.cc" ],
  cuda_deps = [ ":cuda_driver" ],
  rocm_deps = [ ":rocm_driver" ],
  hdrs  = [ "target.h" ],
)
```

The macro simplifies and encourages a strict separation of CUDA/ROCm specific code. It generates separate targets for each backend that have to be compileable on its own.

It fulfills the following requirements:
- Separate independently buildable targets for each backend
- build_cleaner compatible
- No preprocessor branches needed

Note that this is only the first step towards better backend code separation. It forces the user to put some kind of abstraction between backend-agnostic and backend-specific code. For now this can be as simple as a free function interface. In later steps we can move towards abstract base classes and factory functions.
