Simplify boot storage

Calling `ensure_mapping_exists` at more than one place feels clumsy. Surely there is a standard caching pattern we can use? Something like
```ruby
def all_devices
  @all_devices = nil if cache_invalid
  @all_devices ||= init_all_devices  # calls map_devices
  @all_devices
end
```