add a CountdownTimer to simplify writing code to check for expiry, building on duration

for instance get an `Duration.FIVE_SECONDS.countdownTimer()`, wait 5s, then invoke `isExpired()` will return true
cleans up restart logic, so it is smart about whether it needs to do an entity.start() or a driver.launch(), and related fixes which caused problems including setting sensors and creation/recreation of sensor feeds