Rearchitected image loading to be asynchronous and cached (but using
ImageIO instead of Swing Toolkit)