ms-queue: fixup initialization and free lists
There are a few things we fix:
1) We shouldn't initialize node[0].next, since node[0] is the 'NULL'
pointer and should never be accessed.
2) The per-thread free list is too restrictive. Now, we generate a list
of free nodes for each thread that can contain up to 4 node indexes.
We only initialize this list with 2 nodes each (so each thread can
expand its free list, if needed). There is some minimal assertion
framework and race detection performed on these lists, just in case.
3) We only initialize those nodes that are placed in the free list.
Accesses to other nodes' 'next' pointer should trigger an uninitialized
loads assertion.