Add a head/priority queue implementation
Replace the naïve scheduling logic with a priority queue
Make Heap private
Merge branch 'optimized_scheduler'

This resolves #14 and #15.