Guide: Add missing integer type to section on if expressions
auto merge of #16476 : andreastt/rust/ato/consistency_if_expr_example, r=steveklabnik
Introduce lifetime bounds on iterators and other types as needed.
Rewrite Vec iterators to use a transmute and named lifetime so as to meet lifetime requirements
Introduce annotations on object types as required.
Annotate objects in the macro system. Unlike most objects, these ones actually close over references sometimes.
Metadata encoding and decoding.
Syntax -- unify trait superbounds and parameter bounds, as well
as closure bounds. Parse region bounds uniformly, rather than
special-casing 'static.
Change how we represent bounds:
- Use ParamBounds for type parameter bounds
- Use ExistentialBounds for object/closure types
- Replace the "supertrait" list with a ParamBounds, since that is
  what it really is, and because it can include region bounds
Introduce lifetime parameter bounds
Subroutine for compute what relations must hold for a type to be well-formed
Refactor regionck to use a new predicate, type_must_outlive. Move responsibility
for checking object casts into regionck from kindck.
Check that type definitions are well-formed.
region_inference -- update to support "verifys" and "givens",
which enable us to check things like `A:'a` (that's a verify)
and to support constraints like `'a <= $0` (where $0 is an
inference variable).
Introduce region obligations, which are a way for type checker
to record things that regionck will have to later verify.
Guarantee that path type parameters outlive path itself.

This is needed to close a subtle type hole. Without this change, it is possible
to instantiate a type parameter and have it reference regions that are not in
scope at the point where it was instantiated.  This is demonstrated by the test
attached in this post.
Update error reporting to be as helpful as I can make it.
ppaux -- misc pretty-printing improvements
Miscellaneous cleanup
rustdoc -- update for region bounds