Packet format: simple efficiency improvements

This is pull request represents my first step in an attempt to make fred more resource-efficient on the network and packet level. Changes (apart from some minor readability improvements):

### PacketThrottle
* add method to report multiple lost packets, so we can call that instead of
  iterating over `notifyOfPacketLost(…)`

### NewPacketFormatKeyContext
* reduce the operations inside a `synchronized(){}` block to a bare minimum
* only keep track of the sent times of *lost* packets: if a packet is not lost,
  we still have a SentPacket that keeps track of its own sent time (this also
  reduces the amount of work in ack() for the most common code path)
* reduce bounds on packets to track sent time of from 16384 to 128 (we don't
  expect that many *lost* packets on short notice, and if we do, not having a
  super-accurate RTT estimate is the least of our problems)
* improve `ack(…)` CPU efficiency by using `SentTimeCache` instead of `SentTimes`
  (we're no longer concerned about memory given the above, so optimize for
  speed)
* use `for(item : collection)` wherever applicable for readability

### SentTimeCache
* this class replaces `SentTimes`
* uses a `LinkedHashMap` with O(1) lookup instead of a linear search
* uses more memory than `SentTimes` did, but we shouldn't care anymore

### SentTimes
* removed since it's highly inefficient by design and is no longer used
From the commit message:
> * only keep track of the sent times of lost packets: if a packet is not lost, we still have a SentPacket that keeps track of its own sent time (this also reduces the amount of work in `ack()` for the most common code path)

Previously, we stored a "sent time" in `sentTimes` for each packet sent (so that was done in `sent()`. That's unnecessary: if a packet does not get lost, we still have the `SentPacket` around that has the "sent time", so we don't have to store it separately (note that the `ack()` for non-lost packets only removed the "sent time" from `sentTimes` (expensive!) and does no further processing). Once a packet is lost, we no longer keep a `SentPacket` around, so from there on we should cache its "sent time". This is best done in `checkForLostPackets()`, since that is where we decide if a packet is lost. I finally renamed `sentTimes` to `lostSentTimes` to clarify the semantics.