Allow a door and/or a window in the north-west corners of a room.

The north-west corner tile does not support doors or windows, so if a door
or window is placed in a north-west corner of a room, the single NW tile is
split into a W and N tile as appropriate.  If there are already 2 different
wall tiles meeting at a NW corner then that case is handled as well.

To support both a door frame and a window in the same location, a new
layer called "Windows" was added.  Previously, both window and door frame
tiles went into the same "Frames" layer.

It isn't possible to have 2 doors or 2 windows in the same location, that
would require adding a "Doors2" and "Windows2" layers.
Use threads to load tileset images in the background.

When reading a map, MapReader no longer reads the tileset images.
Instead, MapReader creates totally valid tilesets but with all-white tile
pixmaps.  When TilesetManager::addReference() is called, it adds a tileset
to the TilesetImageCache, and then sends that cache-tileset to a job queue
running in a worker thread to load the image.  When a thread finishes
loading an image, TilesetManager sets the tile pixmaps of the cache-tileset
from the image, then updates every tileset using that same image, replacing
the all-white tile pixmaps with the valid image data.  The tilesetChanged()
signal is then emitted to update the display.

When creating a thumbnail image, MapImageManager must wait for tileset images
to be loaded before generating the thumbnail image.
MapImageManager uses 10 threads to load map thumbnails.
TileMetaInfoMgr now uses delayed-loading of tileset images.

The loadTilesets() method uses the TilesetManager to load tileset images
using its worker threads, rather than loading them directly.
Stopped unnecessary loading of tilesets by BuildingTilesMgr::adjustTileNameIndex().
PreferencesDialog lets TileMetaInfoMgr change the current Tiles Directory.
Synching some code with TileZed.