RFC: Collections reform

This is a combined *conventions* and *library stabilization* RFC. The goal is to establish a set of naming and signature conventions for `std::collections`.

The major components of the RFC include:

* Removing most of the traits in `collections`.

* A general proposal for solving the "equiv" problem, as well as improving `MaybeOwned`.

* Patterns for overloading on by-need values and predicates.

* Initial, forwards-compatible steps toward `Iterable`.

* A coherent set of API conventions across the full variety of collections.

*A big thank-you to @Gankro, who helped collect API information and worked through an initial pass of some of the proposals here.*

[Rendered](https://github.com/aturon/rfcs/blob/collections-conventions/active/0000-collections-conventions.md)
I'm not particularly in favour of this exact design, since it is not as efficient as what we have now, in particular, the size hint is ignored (although I guess it is impossible to use in this case anyway, since it's possible for the elements to all be `Left` or all be `Right`), and the `extend` function is doing more work than necessary for a single element push:

```
test extend ... bench:      1057 ns/iter (+/- 91)
test push   ... bench:       775 ns/iter (+/- 83)
```

```rust
extern crate test;
use test::Bencher as B;
#[bench]
fn extend(b: &mut B) {
    let mut vec = vec![];
    b.iter(|| {
        for i in range(0u, 100) {
            vec.extend(Some(i).into_iter())
        }
    })
}
#[bench]
fn push(b: &mut B) {
    let mut vec = vec![];
    b.iter(|| {
        for i in range(0u, 100) {
            vec.push(i)
        }
    })
}
```