This will shield implementations from having to deal with SinkNodeConsumer. The implementation should be pretty similar to the SinkNode that we have today for exec plans. We can use a PushGenerator to be our producer/consumer queue that the RecordBatchReader consumes. The Substrait sink consumer will then push into that PushGenerator. This method would fail if the plan has more than one top-level relation (e.g. more than one sink).