Make engine work without Trace and debugging

Build properly without debugging support. This includes tagging variables
which are only there for being printed in debugging messages as __unused.

Don't generate any Trace code if NDEBUG is defined. Don't try to print a
function backtrace in do_die() then, too.

Now to the embarrasing part: spin_unlock did its __sync_* stuff within
assert() which obviously generates no code with NDEBUG. This was fixed.

Member order in struct mutex changed for cache locality issues.