Where clauses for more expressive bounds

Add `where` clauses, which provide a more expressive means of specifying trait parameter bounds. A `where` clause comes after a declaration of a generic item (e.g., an impl or struct definition) and specifies a list of bounds that must be proven once precise values are known for the type parameters in question.

Main benefits:

- Express bounds on types derived from type parameters, e.g. `Option<T>` where `T` is a type parameter.
- Permits true multiple dispatch.

[Rendered view.](https://github.com/nikomatsakis/rfcs/blob/where-clauses/active/0000-where.md)
On Tue, Jun 24, 2014 at 03:48:51PM -0700, Kevin Ballard wrote:
> Actually even this is unnecessarily repetitious. The `Add` impl trait has no need to be parameterized on the LHS or RHS, as those are both part of the tuple type it's implemented on.

It is true that one could define Add simpler, though it'd be a
semantic change from today since it would have to take its left and
right arguments by value and not by reference (since the argument must
be a `(L,R)` tuple, not `(&L,&R)`). But I wanted to define a pattern
that scales well to the more general case.