Move closure checking into its own file. Shrink check/mod.rs!
Deduce the argument types based on the expected type, trawling through the fulfillment contect if necessary.
Merge the ExprFnBlock and ExprUnboxedClosure into one ExprClosure with an optional unboxed closure kind.
Use the expected type to decide whether `||` is an unboxed or boxed closure.
auto merge of #19113 : nikomatsakis/rust/unboxed-boxed-closure-unification, r=acrichto

Use the expected type to infer the argument/return types of unboxed closures. Also, in `||` expressions, use the expected type to decide if the result should be a boxed or unboxed closure (and if an unboxed closure, what kind).

This supercedes PR #19089, which was already reviewed by @pcwalton.