specify `if let` guards with updated scoping rules
This is based on rust-lang/reference#1823 by @Kivooeo and @ehuss, rebased to resolve conflicts. Per https://github.com/rust-lang/rust/pull/141295#issuecomment-3172434801, I'm opening this as a separate PR to contribute an updated specification of if let guards' drop-scoping rules. The new spec is based on the compiler's implementation[^1], accounting for the changes in rust-lang/rust#143376 and additional corner-cases in examples. I've also done some minor edits to the sections on lexical scope and match expressions, but for the most part they're the same as in rust-lang/reference#1823.
[^1]: As with the rules for other syntactic constructs (e.g. let statements and if expressions), this is slightly simplified. Due to implementation details, the compiler's notion of drop scopes is more fine-grained than is necessary for the language spec.
Tracking issue: rust-lang/rust#51114 Stabilization: https://github.com/rust-lang/rust/pull/141295