Rewrite hed_file_commit()
There old implementation was hard to maintain, because it iterated
over the logical blocks, updating struct commit_control after each
step. As a result, it needed up to THREE temporary buffers to handle
different forwards and backwards written chunks.
The new paradigm is different. Basically, it makes use of the existing
abstraction from the underlying block structure to split the logical
file into FILE_BLOCK_SIZE-sized chunks, which are then written to disk.
This reduces memory consumption (one buffer is always sufficient), and
also makes it easier to implement proper error handling (not done yet!).
Note that block-size granularity also applies to the last (partial) block
in the file, truncating the file afterwards. This can be an issue when
editing a file on a full device if the device block size is smaller than
hed's FILE_BLOCK_SIZE.