A way to query the current state of an artifact, with storedValue returning the current state,
or Nothing if there is no current state (e.g. the file does not exist).

Checking if an artifact needs to be built consists of comparing two values
of the same key with equalValue. The first value is obtained by applying
storedValue to the key and the second is the value stored in the build
database after the last successful build.

As an example, below is a simplified rule for building files, where files are identified
by a FilePath and their state is identified by a hash of their contents
(the builtin functions need and %>
provide a similar rule).

A value of type Modtime will be used to check if a file is up-to-date.

It is important to distinguish Rule instances from actual rules. Rule
instances are one component required for the creation of rules.
Actual rules are functions from a key to an Action; they are
added to Rules using the rule function.

Note: In this example, the timestamps of the input files are never
used, let alone compared to the timestamps of the ouput files.
Dependencies between output and input files are not expressed by
Rule instances. Dependencies are created automatically by apply.

Execute a rule, returning the associated values. If possible, the rules will be run in parallel.
This function requires that appropriate rules have been added with rule.
All key values passed to apply become dependencies of the Action.