[#6942] Allow tools to supply their own icons for nav

This change causes the icons to be fetched via the tool's icon_url()
rather than via the theme css

Signed-off-by: Tim Van Steenburgh <tvansteenburgh@gmail.com>
[#6942] Dynamically generate tool icon css

Signed-off-by: Tim Van Steenburgh <tvansteenburgh@gmail.com>
[#6942] Remove icon images from css

Signed-off-by: Tim Van Steenburgh <tvansteenburgh@gmail.com>
[#6942] Make App.icon_url() smarter

New implementation is smart enough to figure out whether the app
icons are local (in the tool package) or global (part of the active
theme) and generate the proper url accordingly.

Signed-off-by: Tim Van Steenburgh <tvansteenburgh@gmail.com>
[#6942] Fix App.icon_url(), add ETag caching

- Icon resource lookup needed MRO search to work properly with
  "inherited" static resources. Moved that logic out into
  App.has_resource() so it could be used by the EW resource
  registration code in config/resource.py.

- Added ETag caching for the new tool_icon_css so we get some
  browser caching. Unfortunately we can only cache it for the life
  of the server process since we can't tell if new tools have
  been added since the last server start.

- While adding ETag caching I noticed that other app-served files
  (like user and project icons) were not being cached by the browser,
  so I added caching for them too.

Signed-off-by: Tim Van Steenburgh <tvansteenburgh@gmail.com>
[#6942] Add tests for File ETag caching

Signed-off-by: Tim Van Steenburgh <tvansteenburgh@gmail.com>
[#6942] Remove redundant etag_cache() call

Signed-off-by: Tim Van Steenburgh <tvansteenburgh@gmail.com>