Add utility class for cryptographic hashes
Add unit tests for DigestUtils
AbstractModuleInfo: implement Versioned interface

The default implementation just uses the delegate class, analogous to
how the default implementation of Locatable works. This behavior will
need to be overridden in ScriptInfo, since it uses the same delegate
class (ScriptModule) for all scripts.
ScriptInfo: override behavior of getVersion()

Scripts are now versioned according to a datestamp matching the
script's last modified time, together with a hash of the script's
contents (when available).
DefaultWelcomeService: lean on DigestUtils

This addresses issue #82.