Fix double evaluation of read+write operands

Stop read+write expressions from expanding into two occurences
in the AST. Add a bool to indicate whether an operand in output
position if read+write or not.

Fixes #14936
Make variable mutable to allow mutable reference
libstd: Add `Fn`/`FnMut`/`FnOnce` to the prelude.

Closes #16600.
auto merge of #16606 : pczarn/rust/inline-asm, r=alexcrichton

It's unfortunate that the read+write operands need special treatment in the AST. A separate vec for all expressions is an alternative, but it doesn't play nicely with trans.

Fixes #14936
auto merge of #16614 : cdwort/rust/pointer-guide-typo, r=steveklabnik

This appears to be a minor typo. This example implies that x is mutable otherwise the compiler would error on the line before the comment implies.

Please let me know if I'm missing something - I'd love to learn what I got wrong!
auto merge of #16615 : pcwalton/rust/unboxed-closures-prelude, r=huonw

Closes #16600.

r? @huonw