Static drop semantics

Switch to static drop semantics to remove the drop-flag and memory zeroing.

[rendered view](https://github.com/pnkfelix/rfcs/blob/fsk-nzdrop-rfc/active/0000-remove-drop-flag-and-zeroing.md#summary)

# Summary

Three step plan:

 1. Revise language semantics for drop so that all branches move or drop the same pieces of state ("drop obligations").  To satisfy this constraint, the compiler has freedom to move the drop code for some state to earlier points in the control flow ("early drops").

 2. Add lints to inform the programmer of situations when this new drop-semantics could cause side-effects of RAII-style code (e.g. releasing locks, flushing buffers) to occur sooner than expected.

    Types that have side-effectful drop implement a marker trait, `NoisyDrop`, that drives a warn-by-default lint; another marker trait, `QuietDrop`, allows types to opt opt.  An allow-by-default lint provides a way for programmers to request notification of all auto-inserted early-drops.

 3. Remove the dynamic tracking of whether a value has been dropped or not; in particular, (a) remove implicit addition of a drop-flag by `Drop` impl, and (b) remove implicit zeroing of the memory that occurs when values are dropped.

Based on the fact that drop obligations cause values to be dropped at merge points as necessary, I would instead expect the compiler to simply drop the value at the end of each match arm that didn't capture by-move, instead of requiring the user to write the code. This is largely because of this particular issue here, where the user can't possibly drop the value, but the compiler could.