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
Temporarily remove the description for the diagnostic E0162

It turns out that adding new diagnostics is causing link failures
in runpass-full-deps tests. Further investigation pending.
auto merge of #17634 : jakub-/rust/if_let, r=kballard

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