utilities: added a way to avoid duplicate items in RequestQueue.

To use, add a compareRequests method to classes that inherit RequestQueue,
and return true if the two passed requests are the same.
utilities: use de-dup'd RequestQueue in Cache

This means any cache writeback we do will never be duplicated while a
writeback is already pending for the given location in the cache. This also
means we are no longer creating a thread for every single writeback.
ata: don't call doWrite directly in AtaDisk::flush - add a synchronous request to the RequestQueue
ata: don't duplicate requests to the disk
utilities: join wait on duplicate request in synchronous RequestQueue::addRequest