fine-grained locking for scheduling/tracking builds and checking for resources

There's probably some missing test coverage somewhere in here. Also, `Scan()` on the `radar` is a little weird, since each scan is for a single resource, but, it still works fine.
I think there's actually less code now that the locks are non-blocking because we don't have to worry about the signals anymore. It looks a lot simpler to me.