Use thread pool for rendering tiles.

The threads created by TileProviders to handle rendering in the
background cause performance problems as the number of TileProvider
objects grow with each viewer initialized in ilastik. This patch uses a
global thread pool to replace the worker threads created per
TileProvider.

The pool is based on QThreadPool from Qt, where each work unit (render
task) is a QRunnable instance that is processed when a thread is
available.

In the new model, render tasks are kept in a global priority queue
built into QThreadPool. Prefetch tasks are distinguished from the rest,
but there is no difference between tasks coming from different
TileProviders. This is as opposed to the LIFO Queues kept by each
TileProvider for regular and prefetch requests separately.

I couldn't find an efficient way to keep track of (the number of)
waiting render jobs for each TileProvider (without introduced locks
around counters), so I removed the join() method which was only used for
testing.
Switch rendering thread pool to pure Python.

Instead of QThreadPool, use a custom implementation based on
concurrent.futures.ThreadPoolExecutor.
view3d: RenderManager now keeps a reference to the OverviewScene directly, so it can react to reinitializations.
tiling: Ensure that threads in the tile rendering pool have a recognizable name.
Merge branch 'thread_pool'

Conflicts:
	tests/imageScene2D_tests.py
	tests/lazy_test.py
	tests/tiling_tests.py