Apologies for the rookie question, I'm very new to Ethereum. I wanted to make sure I understand correctly the distinction between an Ethereum mining client (i.e. ethminer) versus a just a client, such as geth, eth or parity, particularly with regard to performance and so forth. The rough model I have in my head is, the Ethereum client exposes a JSON-RPC-based service that ethminer then talks to in order to fetch, complete, and return solutions to PoW problems. Ethminer, then, is a "dumb client" talking to the client (e.g. geth) and just banging out hashes on different hardware configs presumably?
My simple question, then, is: a.) why is there only one major mining client, if theoretically the PoW is trivially implemented on a CPU or in CUDA/OpenCL; b.) how is the slowdown of JSON-RPC acceptable in the "race" to get rewarded for a solution, and would a fully binary-level-integrated PoW implementation change things substantially; and c.) what are the relative merits of the different clients? (Is it better to be faster for any practical reason related to obtaining rewards?)