Add support for `while let`

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