Dynamic (re)assignment of processors to slow steps during import

- Made property encoding parallelizable in the batch importer
- Allows for multiple execution monitors
- The "average" stat is now a moving average which responds more quickly to changes
- Added a processor execution monitor that dynamically, throughout the import, (re)assigns processors to steps as it sees fit
This can be made wait-free in the following way: if valueCursor was an AtomicInteger, values was an AtomicLongArray and total was an AtomicLong; then you can getAndIncrement and modulo/mask to get a slot, then getAndSet the new value on that slot, and then getAndAdd the difference between the new value and the old to the total. The average would then be the total divided by the min of valueCursor and values.length.