Fix standard-violating behaviour in queue.c

In C it's undefined behaviour to try to create a NULL pointer via
pointer arithmetic, so the implemenation of xQueueGiveMutexRecursive
has a bug. Decrementing 'pxMutex->uxRecursiveCallCount', strictly
speaking, can never result in a 0 as far as the standard is concerned.

Some compilers (clang, for example) will notice that the followng
test:

    if( pxMutex->uxRecursiveCallCount == 0 )

is always false as a result, and will optimize out that entire block,
leaving the call to 'xQueueGenericSend' out of the compiled code
entirely. Deadlocks and unexpected behaviour result.

This patch fixes up the 'xQUEUE' structure to use actual unions
incorporating the correct types for the overloaded fields. This
change causes correct integer math to take place on the
'uxRecursiveCallCount' field, so no undefined behaviour is
invoked.