Ugarit v1.* release history

BUGFIX: Logging of messages from storage backends wasn't happening correctly in the Ugarit core, leading to errors when the cache backend (which logs an info message at close time) was closed and the log message had nowhere to go.
BUGFIX: Made file cache check the file hashes it finds in the cache actually exist in the vault, to protect against the case where a crash of some kind has caused unflushed changes to be lost; the file cache may well have committed changes that the backend hasn't, leading to references to nonexistant blocks. Note that we assume that vaults are sequentially safe, eg if the final indirect block of a large file made it, all the partial blocks must have made it too.
BUGFIX: Added an explicit flush! command to the backend protocol, and put explicit flushes at critical points in higher layers (backend-cache, the vault abstraction in the Ugarit core, and when tagging a snapshot) so that we ensure the blocks we point at are flushed before committing references to them in the backend-cache or file caches, or into tags, to ensure crash safety.
BUGFIX: Made the splitlog backend never exceed the file size limit (except when passed blocks that, plus a header, are larger than it), rather than letting a partial block hang over the 'end'.
BUGFIX: Fixed tag locking, which was broken all over the place. Concurrent snapshots to the same tag should now block for one another, although why you'd want to *do* that is questionable.
BUGFIX: Fixed generation of non-keyed hashes, which was incorrectly appending the type to the hash without an outer hash. This breaks backwards compatability, but nobody was using the old algorithm, right? I'll introduce it as an option if required.
BUGFIX: splitlog backend now creates log files with "rw-------" rather than "rwx------" permissions; and all sqlite databases (splitlog metadata, cache file, and file-cache file) are created with "rw-------" rather then "rw-r--r--".
BUGFIX: file caching uses mtime *and* size now, rather than just mtime. Error handling so we skip objects that we cannot do something with, and proceed to try the rest of the operation.