custom product algebras

This extends the tuple abstract algebras to work for case classes and similar things. For example:

```scala
import com.twitter.algebird._
import Operators._

case class IntStats(count: Int, total: Int, max: Max[Int])
implicit val statsMonoid = Monoid(IntStats.apply _, IntStats.unapply _)

IntStats(2, 10, Max(7)) + IntStats(5, 13, Max(8)) == IntStats(7,23,Max(8))
```