add util.if_changed() for checking and updating cached values
add testutil.FakeCache