`Combine` trait for string and collection concatenation

Rendered: https://github.com/apoelstra/rfcs/blob/compose-trait/active/0000-compose-trait.md

cc https://github.com/rust-lang/rust/issues/16541
A trait summarises common behaviour, e.g. things that implement `Eq` are expected to have a sensible implementation of equality, things that implement `Add` are expected to have a sensible definition of addition.

Functions can operate assuming that these traits have sensible implementations or else they will return unexpected results, e.g. `HashMap` will not give expected results if a type has a bad `Eq` implementation.

The only thing a non-`unsafe` stdlib function can't do is be memory unsafe with a violation of these sensible properties, since that would allow memory-unsafety in safe code.

This sort of contract (i.e. not enforcable in the signature of a trait) is quite common and is the whole point of traits. It's not just that certain types have a method with a certain signature, but also that that method acts in a particular way.