Rearrange implicits to speedup implicit search

Improves the compile times of client code using
`implicitly[WireFormat[...]]` and `implicitly[AvroSchema[...]`.

Exploits and optimization in implicit search: if an eligible
result has already been found, the compiler does not need to
evaluate if another candidate also satisfies the search if it
is less specific than the first result. "less specific" is the
parlance of static overload resolution. All else being equal based
on the type signatures, a method defined in a subclass of another
is more specific.

The general pattern for organization can be seen here independent form Scoobi:

```scala
import collection.generic.CanBuildFrom

object Slow {
  trait OtherTC[_]

  trait TC[A]

  object TC {
    implicit def genericTc[T: OtherTC]: TC[T] = ???
    implicit def traversableTC[CC[X] <: Traversable[X], T](implicit cb: CanBuildFrom[_, T, CC[T]]): TC[CC[T]] = ???
    implicit def mapTC[M[K, V] <: Map[K, V], K, V]: TC[M[K, V]] = ???
    implicit def tcOption[T: TC]: TC[Option[T]] = ???
    implicit def tcDouble: TC[Double] = ???
  }
}


object Fast {
  trait OtherTC[_]

  trait TC[A]

  trait LowPriorityTC {
    implicit def genericTc[T: OtherTC]: TC[T] = ???
    implicit def traversableTC[CC[X] <: Traversable[X], T](implicit cb: CanBuildFrom[_, T, CC[T]]): TC[CC[T]] = ???
    implicit def mapTC[M[K, V] <: Map[K, V], K, V]: TC[M[K, V]] = ???
  }
  object TC extends LowPriorityTC {
    implicit def listTC[T]: TC[List[T]] = traversableTC[List, T]
    implicit def immutableMapTC[K, V]: TC[Map[K, V]] = mapTC[Map, K, V]
    implicit def tcOption[T: TC]: TC[Option[T]] = ???
    implicit def tcDouble: TC[Double] = ???
  }
}

object Test {
  implicitly[Slow.TC[Option[Option[Option[Option[List[Double]]]]]]]
  implicitly[Fast.TC[Option[Option[Option[Option[List[Double]]]]]]]
}

/*
scalac-hash v2.10.3 -Xlog-implicits test.scala 2>&1 | grep "not a valid"
test.scala:37: Slow.this.TC.mapTC is not a valid implicit value for Slow.TC[List[Double]] because:
test.scala:37: Slow.this.TC.mapTC is not a valid implicit value for Slow.TC[Option[List[Double]]] because:
test.scala:37: Slow.this.TC.traversableTC is not a valid implicit value for Slow.TC[Option[List[Double]]] because:
test.scala:37: Slow.this.TC.mapTC is not a valid implicit value for Slow.TC[Option[Option[List[Double]]]] because:
test.scala:37: Slow.this.TC.traversableTC is not a valid implicit value for Slow.TC[Option[Option[List[Double]]]] because:
test.scala:37: Slow.this.TC.mapTC is not a valid implicit value for Slow.TC[Option[Option[Option[List[Double]]]]] because:
test.scala:37: Slow.this.TC.traversableTC is not a valid implicit value for Slow.TC[Option[Option[Option[List[Double]]]]] because:
test.scala:37: Slow.this.TC.mapTC is not a valid implicit value for Slow.TC[Option[Option[Option[Option[List[Double]]]]]] because:
test.scala:37: Slow.this.TC.traversableTC is not a valid implicit
*/
```