`custom_call`: improve error handling and error messages. (#9680)
This PR refactors the `custom_call` implementation by improving its
error message, and returning a status type value.
**Key Changes:**
- Make `tensor_methods::{tpu,}custom_call` return
`StatusOr<vector<XLATensorPtr>>`
- Improve error messages and error handling
- Create new `CheckCustomCallNonEmptyInputs` function for checking if
there' at least 1 input tensor
- Create new `CheckCustomCallOutputPropertiesSize` function for checking
if the given shapes and dtypes match in size, i.e. they agree on the
number of outputs
- Create new `CustomCallImpl` function for implementing both
`custom_call` and `tpu_custom_call`, since they did mostly the same
thing
- Deleted `CheckIntList` function (should have been deleted in
[#9648](https://github.com/pytorch/xla/pull/9648))
- Deleted `TpuCustomCall` function, inlining it in its corresponding
Python binding, which is how `custom_call` binding is currently
implemented