[mlir][spirv] Use `verifySymbolUses` for `spirv.FunctionCall`. (#159399)
`spirv.FunctionCall`'s verifier was being too aggressive. It included
verification of non-local properties by looking at the callee's
definition.
This caused problems in cases where callee had verification errors and
could lead to null pointer dereferencing.
According to [MLIR's developers guide
](https://mlir.llvm.org/getting_started/DeveloperGuide/#ir-verifier)
> TLDR: only verify local aspects of an operation,
> in particular don’t follow def-use chains
> (don’t look at the producer of any operand or the user
> of any results).
The fix includes adding the `SymbolUserOpInterface` to `FunctionCall`
and moving most of the verification logic to `verifySymbolUses`.
Fixes #159295
---------
Co-authored-by: Jakub Kuderski <kubakuderski@gmail.com>