Modules: treat expired shared dict entries as absent
Expired entries are hidden by read APIs but can still be found by
write operations. replace() can revive an expired entry, delete()
can report that it existed, and incr() can use its old value instead
of init. Without an explicit timeout, incr() can return a value that
a subsequent get() cannot retrieve.
Use a common write-side lookup to remove expired entries and handle
them as missing in both engines. incr() then creates a new entry
with init plus delta and the directive or explicit timeout.
Also return false instead of undefined when QuickJS delete() is
called for a missing key.