add a nil-able StringRefField (aka "the billion dollar mistake")
add a nil-able StringRefField (aka "the billion dollar mistake")

Previously all configuration was stored in objects derived from
StringField, where a missing key would be fixed by writing in the
default value. This patch creates a new `StringRefField` which represents
nil as a missing key. This allows us to express things like:

- key missing: no preference
- key = "": explicitly set something to ""
- key = "foo": explicitly set something to "foo"

Note that `snapshot.Read` will now return `enoent` if the key is missing,
rather than "".

Signed-off-by: David Scott <63c9eb0ea83039690fefa11afe17873ba8278a56@docker.com>
Signed-off-by: Dave Tucker <bfcdf3e6ca6cef45543bfbb57509c92aec9a39fb@dtucker.co.uk>

docker/datakit,docker/datakit,docker/datakit