wrapperutils: Cache resolve() results

At least in the cases that would have called into `resolve_impl`.

This eliminates a large CPU bottleneck and is reflected in reduced
gnome-shell render times:

| Animation       | Before (average/peak) | After (average/peak) |
| --------------- | --------------------- | -------------------- |
| Icon spring     | 12ms / 350ms          | 7ms / 133ms          |
| Window overview | 5ms / 10ms            | 4ms / 7ms            |

Closes: GNOME/gjs#302
12 jobs for fix-302-v1 in 2 minutes and 33 seconds (queued for 2 seconds)
latest
Status Job ID Name Coverage
  Source Check
passed #572216
build_recommended

00:00:49

 
  Test
passed #572218
build_maximal

00:01:43

passed #572219
build_minimal

00:00:51

passed #572217
sanitizer_gcc

00:00:54

 
  Manual
manual #572220
allowed to fail manual
codequality
manual #572221
allowed to fail manual
coverage
manual #572223
allowed to fail manual
installed_tests
manual #572222
allowed to fail manual
sanitizer_clang
manual #572224
allowed to fail manual
valgrind
manual #572227
allowed to fail manual
zeal_11
manual #572225
allowed to fail manual
zeal_2
manual #572226
allowed to fail manual
zeal_4