Replace repeated code with RESUtils.getCacheable

Not sure about `getCacheable` or `maxAge`. (suggestions for better names?)

The idea behind splitting the callback into `callback` and `handleData` is to save a tiny bit on storage space (we don't have to store the whole response), and for a tiny bit of performance when using the cache (we don't have to parse it again).