[core IR] Add decompositions for _assert_async to no-op
Labels: module: inductor, ciflow/inductor, release notes: export

Stack from [ghstack](https://github.com/ezyang/ghstack) (oldest at bottom):
* __->__ #109905

## Context

`aten._assert_async` and `aten._assert_async.msg` were introduced based on https://github.com/pytorch/pytorch/issues/36853 to allow asynchronous assert behaviour when using CUDA tensors.

> It's common to use assertion to check pre-conditions or unexpected inputs in code, as a form of defensive programming. For example, sometimes we want to assert that all elements of a tensor is all positive, or finite.
>
> However, doing assert in python has the following problems in pytorch:
>
> * when dealing with cuda tensors, using python's assert (t>0).all() or assert torch.isfinite(t).all() will wait for results of the cuda kernel and most if not all its preceding kernel launches, thus potentially cause significantly slow down.
> * It would be good to have a way to execute an assert as an async call.
> * It does not work nicely with tracing or FX, because it is considered as control logic

However, when considering ops to preserve during export, these ops are a strange case:

* They are quite narrow in scope; only being relevant for graphs that expect to work with CUDA inputs
  * i.e. these operators are not generic; in the context of the core ATen decomposition table, it would then make sense for it to remove these ops
* Was speaking to @SherlockNoMad and he expected these to be removed by functionalization anyway.
* As outlined in the original comment, assertions were considered "control logic" and thus does not play well with tracing/FX. Implementing assertions as a torch op is a way to circumvent that issue but the original point still stands imo
  * Personally I would think that input checking should be the responsibility of the implementation of individual operators

## Motivation

The premise of these changes is that when exporting a graph that uses `aten._assert_async`, export should remove these ops by default mainly due to the below point

> * As outlined in the original comment, assertions were considered "control logic" and thus does not play well with tracing/FX. Implementing assertions as a torch op is a way to circumvent that issue but the original point still stands imo
>    * Personally I would think that input checking should be the responsibility of the implementation of individual operators

I'm not certain if this premise is correct. Please let me know if you disagree.

## Changes

This PR adds decompositions of `aten._assert_async` and `aten._functional_assert_async.msg` to no-op and adds the decomp to the core ATen decomposition table. The assumption is that most export workflows will not want to preserve these operators due to the stated premise.

In fact Inductor already added these decomps so I am essentially moving them to the more general `decompositions.py` location, and removing the existing Inductor decomps as they are now superfluous.

Please let me know if there is a better approach to remove these operators.




cc @voznesenskym @penguinwu @EikanWang @jgong5 @Guobing-Chen @XiaobingSuper @zhuhaozhe @blzheng @Xia-Weiwen @wenzhe-nrv @jiayisunx @peterbell10 @ipiszy @yf225 @chenyang78 @kadeng @muchulee8 @aakhundov