Add support for `while let`

This is *heavily* based on `if let` (#17634) by @jakub- and @kballard

This should close #17687
nit: Could you please make this a specific pattern, i.e.:

```rust
    MatchNormal => span_err!(cx.tcx.sess, pat.span, E0001, "unreachable pattern")
```

The set of variants of this particular enum probably won't grow in the near future but it's still good for clarity, I think.