Bug 1022247 - Icon fetching refactoring

### Goal:

This PR contains a number of changes which fix various bugs but it's primary goal is to:

  - ensure we don't cache icons forever
  - handle icon fetching errors and do the right thing
  - sanely test (as much as possible) with integration tests

### Walkthrough:

1. IconRetriever is gone and async_storage is not used anymore in gaia_grid... We still fetch icons of course but this is done with a private method inside the gaia_grid component. I found that using the lazy loader added some overhead and the code is now small enough to justify keeping it in the same file (IMO)

2. GridItem will emit (via dispatchEvent) gaiagrid-iconblobload and gaiagrid-iconbloberror to indicate when the icon has been fetched successfully or not... if the icon was a blob it is stored on .detail.defaultIconBlob. 

3. .detail.defaultIconBlob is used on fetching errors if available otherwise the default icon is used (which now lives in the web component)

4. app.js in verticalhome listens to the new gaiagrid events and handles the download retry logic (when we go from an offline state to an online state) and some supporting logic in store/item.js

5. Lots of new test infrastructure with a node server to help us emulate a number of states (like broken socket, unresponsive socket, etc..)

This also happens to fix a bug where we don't display a default icon on the search app.

### Other notes:

Generally speaking relying on XHR (and the underlying network cache) to do the right thing is much better then implementing caching ourselves in search/collections... They seem to do the right things without us needing to re implement network caching.

This also means that our blob cache in the homescreen is for backup purposes only and may not be hit even if we are offline (network cache gets hit then we use our blob if available.)

I think the problem here is that doing this bypasses all of the logic we do in renderIconFromImage. It's kind of confusing because we have this graph of icon states, but it is not structured like a graph, and you can bypass parts and break things.

In this case we are no longer processing the search icons because we miss this path: https://github.com/lightsofapollo/gaia/blob/icon-fallbacks/shared/elements/gaia_grid/js/items/grid_item.js#L171