Infer destructor `this` lifetimes, even when elision is disabled.

We need something like this so that we can generate bindings for the `Drop` trait, which requires lifetime. Before this change, post-inference, we were just redoing the work that inference could do, and this added complexity -- for example, before this change, one part would do the transformation to a `&mut` reference with lifetime, and a different part would not. After this change, by hardcoding the inference in the lifetime inference layer, not source code generation layer, we remove any kinds of accidental confusions like this.

(Admittedly, perhaps the structure here is not ideal, feedback welcome.)

---

A note on the `operator=` change.

Naively doing this caused a use-after-free (UaF) in `ValueLifetimes::operator=` -- it has a `unique_ptr` which holds a type which holds a `ValueLifetimes`, and apparently somebody was doing, effectively, `x = x.object_lifetimes_->value_lifetimes_`, which causes a UaF when `object_lifetimes_` itself is is overwritten, destroying the assignment `other`. I don't know how one "normally" works around this -- in practice I've ~never hand-written an `operator=` -- but the obvious aliasing-safe workaround is to just store in a temporary variable (or struct) first, and then assign all at once when we're done using `other`.

Took me like an hour to get over my blank incomprehension and debug this... The irony is not lost on me that I had a very gnarly UaF while editing our lifetime annotation code.

Anyway, I'm not sure why this change caused the aliasing assignment, but it seems plausible that we should support aliasing assignment, and I can see no issue with doing it this way. (Widdershins in ##python-offtopic also suggested an alternate solution, of defining `operator=` in terms of the copy constructor, rather than the other way around. P.S., thanks for helping me reason through the options!)

PiperOrigin-RevId: 452530670
diff --git a/lifetime_annotations/lifetime_annotations_test.cc b/lifetime_annotations/lifetime_annotations_test.cc
index 2838c6b..75bc713 100644
--- a/lifetime_annotations/lifetime_annotations_test.cc
+++ b/lifetime_annotations/lifetime_annotations_test.cc
@@ -212,6 +212,16 @@
               IsOkAndHolds(LifetimesAre({{"S::method", "a: b, c -> (a, a)"}})));
 }
 
+TEST_F(LifetimeAnnotationsTest, LifetimeElision_Destructor) {
+  EXPECT_THAT(GetNamedLifetimeAnnotations(R"cc(
+                // Note: this works even without #pragma clang lifetime_elision
+                struct S {
+                  ~S();
+                };
+              )cc"),
+              IsOkAndHolds(LifetimesAre({{"S::~S", "a:"}})));
+}
+
 TEST_F(LifetimeAnnotationsTest, LifetimeElision_ExplicitlyDefaultedCtor) {
   EXPECT_THAT(GetNamedLifetimeAnnotations(R"(
           #pragma clang lifetime_elision