ToTraversable

[Only the last two commits are relevant, they rely on some elements of the first four, that are also in https://github.com/milessabin/shapeless/pull/114].

This PR mainly adds a .to[M] method on HLists (and tuples). It allows one to write things like:
val hl = a :: b :: c :: ... :: HNil
val l = hl.to[List] // List[some Lub type], should be the same type as the one inferred for List(a, b, c, ...)
val ar = hl.to[Array] // Same thing with Array - note that it also works with non covariant containers
// Also works with IndexedSeq, Set, ...

This method is added by the first relevant (actually fifth) commit of this PR.

If one wants to supply a Lub instead of the one found by the implicit ToTraversable used by .to[M], the methods .toList[Lub] and .toArray[Lub] are still there, and their implementation relies on the same implicits as ".to[M]" (change made by the second - or sixth - commit)

val lt = hl.toArray[SomeClass]

(Obviously, supplying a Lub to .toArray and .toList is not mandatory, and .toArray and .toList should be synonymous to .to[List] and .to[Array])
I added a commit that adds type aliases for ToList and ToArray in ops.hlist and ops.tuple. I also flagged them as deprecated (should they?).

For tuples, there were also auxiliary type aliases ToList.Aux[T, Lub, Out0] and ToArray.Aux[T, Lub, Out0]. They involve an Out0 type that can't be aliased, because ToTraversable.Out is not free (it is set to M[Lub]).

Another way of keeping a backward compatibility would be to keep the former ToList and ToArray definitions (which would not be used anymore in shapeless), and to flag them as deprecated.