[SYCL-RTC] Use `ToolInvocation` directly instead of via `ClangTool` (#19922)
We only run SYCL JIT on a single TU at a time, so using `ClangTool` is a
bit awkward, as it is primarily used to run the same action across a set
of files:
https://github.com/intel/llvm/blob/357f96b7e19d8acb972eb2f1fb276dbc6aa2060b/clang/include/clang/Tooling/Tooling.h#L310-L317
Using `ToolInvocation` better matches our scenario of always doing a
single clang invocation:
https://github.com/intel/llvm/blob/357f96b7e19d8acb972eb2f1fb276dbc6aa2060b/clang/include/clang/Tooling/Tooling.h#L244-L245
Another benefit is that we have more control over the virtual file
system which I'm planning to use in a subsequent PR to have the SYCL
toolchain headers distributed inside `libsycl-jit.so` and then put into
an `llvm::vfs::InMemoryFileSystem` once to be re-used across all
compilation queries.
I'm also simplifying the inheritance scheme around `clang::ToolAction`.
Instead of having both hashing/compiling doing that, I'm providing a
single helper that accepts a reference to the `FrontendAction` that can
be kept on the caller's stack, reducing the amount of boilerplate
helpers necessary, i.e.
`RTCToolActionBase`/`GetSourceHashAction`/`GetLLVMModuleAction` before
vs. single `SYCLToolchain::Action` after.