[NVIDIA TF] Optimize embedding_lookup_sparse using new grad op [PART 1/3]
Hi @cantonios Can you please review this PR ? Thank you! This is currently failing the following test internally: `//tensorflow/python/kernel_tests/math_ops:segment_reduction_ops_test_cpu`. It looks like it passes externally though. The error is:

```
[ RUN      ] SparseSegmentReductionOpTest.testGradientV2SegmentsInvalid4
F0607 16:23:53.050092     384 shape_inference.cc:113] Check failed: output(i).IsSet() 1 for {{node SparseSegmentSumGradV2}} = SparseSegmentSumGradV2[T=DT_FLOAT, Tidx=DT_INT32, Tsegmentids=DT_INT32](Const, SparseSegmentSumGradV2/indices, SparseSegmentSumGradV2/segment_ids, SparseSegmentSumGradV2/dense_output_dim0)
```

Perhaps it only fails internally due to a difference in build flags. Can you see if the following passes, and if not, fix the issue?

```bash
bazel test -c opt --copt=-UNDEBUG --test_env='TF2_BEHAVIOR=1' //tensorflow/python/kernel_tests/math_ops:segment_reduction_ops_test_cpu
```

If this passes for you, we'll debug internally. Thanks Reed, I've fixed it.
`embedding_lookup_sparse` currently uses separate `Unique` + `Gather` + `SparseSegmentSum` ops. In some cases the `Unique` and `Gather` ops can be elided, leaving the `SparseSegmentSum` to read the embeddings directly. However, this causes the function to return a dense gradient, which is impractical in cases where the embedding table is very large.

This series of PRs solves this problem by adding a new op, `SparseSegmentSumGradV2` (plus `Mean/SqrtN` versions), that fuses the Unique operation into the gradient calculation and directly returns a sparse gradient (`IndexedSlices`). In addition to enabling elision of the `Gather` + `Unique` ops in more cases, the new op also improves performance by taking advantage of lower-precision indexing for internal temporary tensors. An included benchmark demonstrates a 2x speedup for `embedding_lookup_sparse` out of the box.

More details are available in the commit messages.

Part 1 adds the new ops with a CPU kernel implementation.
[Part 2](https://github.com/tensorflow/tensorflow/pull/61294) adds GPU kernel implementations.
[Part 3](https://github.com/tensorflow/tensorflow/pull/61491) integrates the new ops into `embedding_lookup_sparse` and includes a benchmark.

cc @nluehr @pjannaty 