Align start pointer with task memory boundary
Use doubly linked list for tasks

Using a doubly linked list enabled keeping a list with runnable tasks
and a list with suspended tasks. This in turn makes the schedule
function a lot cheaper if all tasks are suspended.
Convert queue rotation to macro in queue.h
Use separate queue for suspended tasks