DOE: add preprocessors to be called before each iteration

The objective of a DOE algorithm is to sample a collection of functions.

Before generating the i-th sample, the user may want to do some preprocessing.

For that purpose, a DOE option preprocessors: Iterable[Callable[[int], None] would be suitable.