A weak link target is zeroed before we unregister it. Avoid a race condition if we suspend in the middle. Fixes #9590

	* sgen-fin-weak-hash.c: A mutator thread unregistering a weak link does zero it before staging the
	request for unregister. This is done without holding any GC lock, which means it can be stopped at any
	point in between.

	Storing zero breaks because REVEAL_POINTER xors the value resulting in an invalid pointer and code walking
	the weak table tries to poke that pointer. Encoding hidden zero (IOW -1) does not work either because we range
	check those values and for the major collection we pass (0, ~0) as the valid range.
Add test for #9590.