Instance derivation for C[T] where T <: HList or <: Coproduct

Previously, this was impossible, since `T` was too constrained.

I also cleaned up a little in `generic.scala` as I went and added that functionality.