Modules: removed shared dict expiration from read-locked paths.
Previously, keys(), items(), and size() called ngx_js_dict_expire()
under a read lock. Since ngx_js_dict_expire() deletes nodes from
both rbtrees and frees slab memory, concurrent readers on different
worker processes could corrupt shared memory by freeing the same
expired nodes simultaneously.
The fix removes ngx_js_dict_expire() calls from all read-locked
paths and instead skips expired entries during iteration, consistent
with how get() and has() already handle expiry. Actual cleanup of
expired entries is deferred to write-side operations (set, add,
delete, clear).