Change step_callback behaviour of Scipy optimizer in gpflow2 to behave as in gpflow1 (#1111)
Change step_callback behaviour of Scipy optimizer in gpflow2 to behave as in gpflow1 (#1111)

Changes behaviour of step_callback so that the callback only gets called once per optimisation step, not once per objective function evaluation. Makes gpflow2's Scipy() behave more like gpflow1's ScipyOptimizer()/monitoring.

* Call step_callback through scipy.minimize's callback procedure (at the end of each step); previous behaviour was to call step_callback at each evaluation of objective function

* split off from unpack_tensors (now stateless) the new assign_tensors (assigns to variables)

* change callback_func to pass variables and their current values to step_callback, not assigning/computing loss/gradients

* fix type signature

* Improve docstring
GPflow/GPflow