engine: trigger engine reconciliation on job target state changes

@bcwaldon thoughts on something like this? Small step towards making polvi happier...
You're right. From the golang spec:

> If one or more of the communications can proceed, a single one that can proceed is chosen via a uniform pseudo-random selection. Otherwise, if there is a default case, that case is chosen. If there is no default case, the "select" statement blocks until at least one of the communications can proceed.

So I guess what I really want here is a priority select, where `case <-done` is always given a chance to be triggered before `case <-e.trigger`. Something like:

```
for {
  select {
  case <-done:
    return
  default:
    select {
    case <-e.trigger:
    case <-done:
    }
  }
}
```

Am I being too paranoid that the pseudo-randomness isn't actually random enough?