reduce memory usage for tasks

Saving a couple of dozen bytes per item in the data structure sounds like unnecessary micro-optimisation! I expect the task objects themselves easily dwarf the savings. The extra few meg of overhead *might* have tipped the balance in your OOME case, but the real problem was the crazy-high number of queued tasks to begin with.

Thoughts:
 * Iterating over the result from `getTasksWithTag()` absolutely must be possible without raising `ConcurrentModificationException`s; a defensive copy is probably necessary here, assuming the live collection is frequently changing (i.e. so `CopyOnWriteArrayList` would always degenerate to making the copy).
 * If other callers similarly sort the returned tasks, or if they don't care, the `ExecutionManager` could simply store them in the commonly-desired order, avoiding the explicit sorting step (and associated copy). `TreeSet`'s log(n) performance might kill that idea thoguh.