Teach libsyntax about `if let`
Desugar 'if let' into the appropriate 'match'
Add tests for `if let`
Produce a better error for irrefutable `if let` patterns

Modify ast::ExprMatch to include a new value of type ast::MatchSource,
making it easy to tell whether the match was written literally or
produced via desugaring. This allows us to customize error messages
appropriately.
Move `if let` behind a feature gate
Update based on PR feedback
Add `if let` to the reference
Update after the fall out from the syntax::ptr changes
auto merge of #17634 : jakub-/rust/if_let, r=kballard

Continuation of https://github.com/rust-lang/rust/pull/16741.