Add support for `while let`

This is *heavily* based on `if let` (#17634) by @jakub- and @kballard

This should close #17687
That's discussed in the RFC: https://github.com/rust-lang/rfcs/blob/master/active/0068-while-let.md#detailed-design