=rem #16428 optimize protobuf serializer for master

#16428 for master
will this be OK?
```scala
  def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef =
    manifest match {
      case Some(clazz) ⇒
        def parse(bytes: Array[Byte], clazz: Class[_]): Message = {
          def parseMethod(clazz: Class[_]): Method = {
            parsingMethodBindingRef.get().get(clazz) match {
              case Some(m) ⇒ m
              case None ⇒
                @tailrec
                def cacheMethod(clazz: Class[_], method: Method): Method = {
                  val parsingMethodBinding = parsingMethodBindingRef.get()
                  val newParsingMethodBinding = parsingMethodBinding.updated(clazz, method)
                  if (parsingMethodBindingRef.compareAndSet(parsingMethodBinding, newParsingMethodBinding))
                    method
                  else
                    cacheMethod(clazz, method)
                }
                import ProtobufSerializer.ARRAY_OF_BYTE_ARRAY
                cacheMethod(clazz, clazz.getDeclaredMethod("parseFrom", ARRAY_OF_BYTE_ARRAY: _*))
            }
          }
          parseMethod(clazz).invoke(null, bytes).asInstanceOf[Message]
        }
        parse(bytes, clazz)
      case None ⇒ throw new IllegalArgumentException("Need a protobuf message class to be able to serialize bytes using protobuf")
    }
```