[Async DB] Modularize Zotero.DataObject.save()

At this point, I just mostly want to check if this is an OK direction.

What this allows us to do is, after extending, say, a `Zotero.Item` class, to override the `_saveData` method in order to write additional data before the DB transaction is committed. It also removes a bunch of boilerplate code from `DataObject` child classes (there's probably more that can be removed)
`fixGaps` we can make an option by overriding `.save` and then moving it from arguments to options (I guess that's what you're suggesting), which looks like the right thing to do (at this point I was trying to change as little as possible, so this _is_ somewhat messy).

No opinion on `transactionOptions`, but in addition to `isNew`, `env` is also used to pass other variables between `_saveData` and `_finalizeSave` (e.g. Zotero.Collections passes `parentIDs` that way).