Improve the memory footprint when loading bitmaps

Handle the image loading in the imageForBounds() call, where we have the requested bounds. The loader will query for the bounds and potentially load a lower resolution of the the bitmaps into the memory.
The loading will be done in an AsyncTask when the call is coming from the UI, and as a direct loading in case it's not. However, note that the completion of the imageForBounds() method is synchronized, and we call 'get()' on the task (this is the case when dealing with remote resources only).