all RPCs are handled asynchronously, and any synchronous function is wrapped so it's async