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.
Only print "irrefutable if-let pattern" errors once

When an `if let` translates into a `match` with more than two arms, we
don't want to print multiple "irrefutable if-let pattern" errors.
Move `if let` behind a feature gate
Update based on PR feedback
auto merge of #16741 : kballard/rust/if_let, r=nick29581

Implement the new desugaring `if let` syntax.

Fixes #16779.