Use intrusive_ptr for LazyTensor (#73429)
* Make LTCTensorImpl hold an intrusive_ptr to LazyTensor
* Change code to pass around LazyTensorPtr instead of LazyTensor
Consolidate the notion of a 'null LazyTensor' to mean just a LazyTensorPtr with no target
* (previously, a LazyTensor object could also itself be 'null' if it held a null Data ptr, now we insist it always holds a valid Data)
* as a result, also discard operator bool() and is_null() methods from LazyTensor class