Address Reynold's review comments
Two performance fixes:

- Track empty blocks instead of non-empty ones.
- Materialze the set of empty blocks as a set to allow for constant-time
  lookup instead of logarithmic binary search in bitmap lookups.