Runner that holds training components and provides methods to execute training steps.
Perform a single training step: forward, backward, optimizer step, and zero grad.
Optional helper to run a training loop over a dataset.