Adminotech - AssetAPI asset bundle support + ArchivePlugin for zip bundle implementation

This pull request encapsulates two things. First proper support for asset bundles to AssetAPI and secondly ArchivePlugin that implements zip bundle support agains the new functionality in AssetAPI.

I recognize that this is very big commit and touches lots of places in AssetAPI. I'd be happy to receive code review and suggestion how to take the work forward/do fixes if there is need. Especially from people who have been working with the AssetAPI internals before.

## AssetAPI

AssetAPI now has a consept of asset bundles. It understands what they are and that they are there to provide IAssets. `IAssetBundle` is a new interface that needs to be implemented when someone wants to introduce a new asset bundle type. There is also similarly `IAssetBundleTypeFactory` just like IAssets have factories. These factories can be registered from 3rd party plugins (like ArchivePlugin). The factories create asset bundles that again provide sub assets.

AssetAPI has been modified to understand the difference of bundles and sub assets inside of them. This is totally transparent to the code that actually calls `AssetAPI::RequestAsset(...)`. Asset references in Tundra can now be bundle#subAsset eg. assets.zip#materials/my.material. When a request like this comes to the asset system it will detect that it first needs the asset bundle in front of the # separator. It will request the bundle normally via an asset transfer that will be materialized into the `IAssetBundle` with the bundle factory. Once the bundle has been loaded successfully all the pending sub asset requests to it will be loaded from the bundle and their asset transfers will succeed or fail depending on weather the bundle can provide them. Again this is totally transparent to 3rd party code that calls RequestAsset(bundle#subAsset) and the flow is exactly the same.

Relative references will work inside a sub asset like they do normally. If "assets.zip#materials/my.material" depends on `my.png` the context will be correctly resolved to "assets.zip#materials/" if the dependent sub asset is in the root it will resolve correctly to "assets.zip#".

*As a last note:* IAssetBundle was made for the zip implementation but it is meant to be for generic Tundra bundle support. This means other modules can implement what ever they please with this feature. One that has been talked a lot is the collada file support, that actually is a bundle that can contain multiple meshes/materials/textures. Following the example from ArhiveModule this should now be a trivial task in a 3rd part plugin instead of hacking around AssetAPI limitation because it does not understand the notion of bundles.

**Feature summary**

* New `IAssetBundle` and `IAssetBundleTypeFactory` for plugins to implement and register their bundles.
* Fixed the hardcoding away from `AssetAPI::GetResourceTypeFromAssetRef`. This made AssetAPI aware of all the potentially supported asset types even if their factories were in 3rd party modules. This function is no longer static and it will query all the registered IAsset and IAssetBundle factories if they can handle the file extension of the requested reference. There was a long standing todo in the function that the type should be asked from the factories and not be hardcoded.
* Fixed local asset provider not to block if there are lots of failing requests. This made Tundra unresponsive if there was eg. 500 local refs to disk that did not exist for a long time. Essentially adds the same throtling check when the requests fail like it is in the succeeded code path. This was particularly a problem for scene that used EC_Materials output name as local://generatedname.material with hundreds of objects. These generated ones first go to the local provider, fail with nasty error prints and are reloaded via AssetRefListener once they are programmitically generated in EC_Material.
* Assets windows (shift+a) has been modified to show all IAssetBundles just like we do with storages. It will show the zip and all sub assets loaded into memory from it under it. You can reload/unload/refetch/modify/open cache file for the sub assets with the right click menu as you would expect.

## ArchivePlugin

This new Tundra plugin provides asset bundle support for ZIP files. It is a optional module but my proposal is to make it part of the core distribution. In this pull request it is turned on by default for windows and can be enabled to linux/mac as soon as their build scripts satisfy the zziplib dependency. Windows full build script now has support for building zziplib and zlib (dependency for zziplib) from sources.

**Motivation for the work**

ZIP file support is important for Tundra as we start to get bigger and bigger scenes. Lets take a example scene where we have 600 http asset references to the web. Now we already have our AssetAPI and AssetCache aware of last modified checks and it will only download the files from the web if they have been changed. But the last modified is always done to the server never the less (so we know if it has changed). Jukka and friends at Ludo have already shows some measurements that show that AssetAPI takes significant time to process these in our example 600 last modified web requests, its a huge amount of web requests even if they are very small in size. 

ZIP support mitigate this problem to as many last modified requests as there are zip bundles in the scene. If we pack all the static content that is not expected to change when the scene is ready to a single zip file, we end up with one request check, no re-download for the zip from the web, threaded unpacking of the zip file and asynch loading (for those types that support it eg. ogre assets) for the sub assets.

**Implementation details**

ArhivePlugin is now supporting zip files via zziplib library. Current implementation extracts the whole file into the asset cache as is with the full asset reference. I decided to go with this route as it seems nicer to do this rather than for every sub asset request open the zip file in memory and read the data for the sub asset. Additional benefit from this is that we get perfectly valid DiskSource() for the sub assets that get loaded. Which makes OgreMeshAsset and friends load the file asynchronously as there is a valid AssetCache entry for them.

*Update: I made the worker only extract files that have changed. Meaning if the zip was not re-downloaded from source, only missing sub assets will be extracted. This will save a lot of time for big zip files.*

Why its called ArchivePlugin is that my idea is to expand support to .7z, .rar or any other "archive" file format into this plugin. This ways we don't have to make small plugins for each file format. The factory has been designed so that it can provide multiple bundles in its CreateEmptyAssetBundle() by detecting the file suffix. Only thing that needs to be made is a IAssetBundle implementation and a few lines to ArchiveBundleFactory.

**Feature summary**

* Registers "Archive" type bundle factory to AssetAPI.
* Deserializes the zip to asset cache in a worker thread that won't block the main loop.
* Provides sub asset data from the bundle to AssetAPI to make the IAssets.

----

Please contact me here if you need a test scene with a txml and zip to test this. You can roll up your own easily from any existing scene. Just zip the assets file structure and put "myzip.zip#" in front of every reference in the scene!