OK, this seems like the best option.

We use #hash to ensure that options isn't retained in memory, and only
return the memoized value if it exists, since the block is only called
when there's no value.

The other option is to just not memoize, although that new branch I'm
working on would definitely benefit from memoization here