Teach libsyntax about `while let`
Desugar `while let` into `loop { match { ... } }`
Move `while let` behind `while_let` feature gate
Handle `while let` desugaring
Add tests for `while let`
Add `while let` to the reference

Closes #17687
Use explicit case rather than catch-all
auto merge of #17733 : jgallagher/rust/while-let, r=alexcrichton

This is *heavily* based on `if let` (#17634) by @jakub- and @kballard

This should close #17687