consolidate different pieces of a gRPC call into different functions
consolidate different pieces of a gRPC call into different functions

A gRPC call consists of several distinct actions:
1) Create the call
2) Send messages
3) Close the client
4) Receive messages
5) Cleanup.

Notably 2 and 3 can be interwoven, but generally
the client should be closed before the last receive-message
(for server streaming), or right after the last send-message.

It makes sense to package each into their own call.

We also add a struct to hold the call data.

PiperOrigin-RevId: 401605149

qitab/grpc,qitab/grpc