Add callback method for substeps during gradient accumulation.
# 🚀 Feature request

Add a callback method which is called between `on_step_begin` and `on_step_end` i.e. during gradient accumulation steps.
Something like `on_substep` which is called after each gradient accumulation step.

## Motivation

Some training techniques require custom code to be run after each substep during gradient accumulation . A commonly used tool is Opacus for differentially private training. It introduces a `privacy_engine` and requires `privacy_engine.virtual_step()` to be called during gradient accumulation substeps and `privacy_engine.step()` when accumulation is done. For example see https://github.com/pytorch/opacus/blob/master/tutorials/building_text_classifier.ipynb

With this in place we could quite easily extend the trainer to support differentially private training with Opacus.

## Your contribution

This should be fairly straight forward as we just need to add one method call to `trainer.Trainer` and a new method to `trainer_callback.TrainerCallback`. Happy to provide a PR.

We can definitely accept a PR with this new method, as it seems there is a clear use case for it.