engine: Queues can now operate on multiple heaps at once

This change will let us perform O(1) merges of queues in the
future. The downside is that Pull and Peek operations must
compare the first task in each heap until only one non-empty
heap remains.
engine: Start defining Namespace methods
engine: Namespace.Pull(string) -> Namespace.Pull(...string)
core: Rename the engine package to core