add Clock interface and fakeClock for time testing

@bcwaldon this is what I was talking about ages ago but never got around to. Ultimately we would convert all time.Sleep/time.After usages within fleet to use this.
@bcwaldon I'm anticipating that introducing more of this pattern is going to cause you to cringe, but I really can't think of a good, simple, alternative solution right now. It's essentially just forcing goroutines to yield until the events we're interested in occur, and ensuring we time out quickly if things are wrong. 

Importantly, even with all of these, the tests still run in <0.02s.