The system shouldn't finish init until the QuerkiNodeManager is ready

(Bug, Investigate , Priority: High, Test Status: No automated tests yet , Reported By Justin du Coeur, )
Summary: See details, but at the moment I believe there is a several-second window when the system has started up, but creating Things and Users will fail because it isn't completely booted.
Consider: you can't create anything until the OIDAllocator is ready. That can't happen until the QuerkiNodeManager receives its Shard ID. And that process can potentially take several seconds, since it needs to communicate with the QuerkiNodeCoordinator.
The problem is, init() is currently synchronous, and there is no way to say "wait until this Actor says that it is ready". We need to introduce async initialization, so that an Ecot doesn't count as initialized until an async flag is set.
The most straightforward way to do this is likely to introduce a new initAsync():Option[Future[_] ] wrapper around the existing init(). By default, this would just say:
def initAsync() {
  init()
  None
}
That is, call the synchronous init() function, and don't return a Future. But Ecots can override this and return a Future. Dependents on this Ecot won't init() until this Future completes successfully -- when the Future finishes, we re-examine the current dependency queue and see what's ready next. The system won't finish Ecology.init() until all of them have resolved. If one of these Futures produces a failure, that's a system panic and a fatal shutdown.
The implication is that Ecology.init() itself must now produce a Future, which will be a mild PITA, but I don't think we call that from too many places.
Once this enhancement is made, I think Ecology will be ready for prime time to split out into a library. It really always ought to have worked this way, but my idiomatic Scala wasn't good enough at the beginning to see the right approach. (I wasn't yet thinking in terms of All Futures, All the Time.)