fix Issue 12855 - Shadow register assignments for spilling can conflict

This fixes an ugly bug, took me a long time to track it down.

The fix is to prevent shadow registers to be spilled to other shadow registers. It also now favors assigning shadow registers to themselves when enregistering.

This fix is blocking https://github.com/D-Programming-Language/dmd/pull/3620
Note to self: read the whole thing before start commenting...