Implement per-solver per simulation step max time

From now on, each solver has a maximum runtime (in ms) per simulation
step. The solver should stop immediately if this time is surpassed, and
return whatever solution it has computed so far.

It is highly advisable to set the max times so that the sum of the max
times of all solvers in use (the main and the test ones) is a bit lower
than the agent's allowed think time. This guarantees that the agents
will receive some assignment at each iteration, even though it may not
be very good.