Convenience abstract class for companion objects of RPC interfaces. Makes sure all three RPC type classes
(AsRawRPC, AsRealRPC and RPCMetadata) are macro-materialized for that RPC interface and confines
macro materialization to the same compilation unit where the RPC interface is defined.
This is a good practice to avoid incremental compilation problems and duplication of macro-generated code
in various callsites. In order to be able to use RPCCompanion, the RPC framework must define FullRPCInfo
as a trait or class. Additionally, some special wizardry has been employed to make sure that when an RPC interface
is a part of shared (cross-compiled) code of a ScalaJS application then ScalaJS optimizer can remove unused
instances of macro generated typeclasses.

Materializes a factory of implementations of RawRPC which translate invocations of its raw methods
to invocations of actual methods on rpcImpl.

Materializes a factory of implementations of RawRPC which translate invocations of its raw methods
to invocations of actual methods on rpcImpl. Method arguments and results are serialized and deserialized
from/to RawValue using Reader and Writer typeclasses.

Materializes a factory of implementations of T which are proxies that implement all abstract methods of T
by forwarding them to rawRpc.

Materializes a factory of implementations of T which are proxies that implement all abstract methods of T
by forwarding them to rawRpc. Method arguments and results are serialized and deserialized
from/to RawValue using Reader and Writer typeclasses.