RFC: cmp and ops reform

This RFC proposes a number of design improvements to the `cmp` and
`ord` modules in preparation for 1.0. The impetus for these
improvements, besides the need for stabilization, is that we've added
several important language features (like multidispatch) that greatly
impact the design. Highlights:

* Make basic unary and binary operators work by value and use associated types.
* Generalize comparison operators to work across different types; drop `Equiv`.
* Refactor slice notation in favor of *range notation* so that special
  traits are no longer needed.
* Add `IndexSet` to better support maps.
* Clarify ownership semantics throughout.

[Rendered](https://github.com/aturon/rfcs/blob/cmp-ops-reform/text/0000-cmp-ops-reform.md)
Has the option of changing this to `fn deref(self) -> Result` been considered? So all `impl Deref for Bar { type Result = Foo; ... }`s would be changed to `impl<'a> Deref for &'a Bar { type Result = &'a Foo; ... }`. The advantage of this is that `Deref`, `DerefMut`, and even the hypothetical `DerefMove` could all be combined into a single trait. The same transformation could happen to `Index` as well (and maybe even the `Fn` traits), although `IndexSet` would still be required for maps. Such a change to all those traits would probably require adjusting the existing compiler machinery that determines which trait to use to instead determine how (if at all) to auto-reference.

I feel that there’s got to be *some* reason why this isn’t feasible, but I can’t think of one, other than requiring some extra auto-referencing logic. All the other traits are being by-value-ified, which is great, so it would be nice if that could extend to every trait.