File::AccessError is now thrown for all file-related exceptions which don't
have more specific types (rather than std::runtime_error), which requires some
changes to how exception messages are built when translating them to get nice
results.
Also add `Realm::write_copy()` which just wraps `Group::write()` with error
translation.