Structured keys
val empty : tempty is the empty key. It refers to the top-level dictionary.
val v : string -> tv s is the string s as a key. A key "/foo/bar" is decomposed into the segments "foo" and "bar". The initial "/" is always ignored so "foo/bar" and "/foo/bar" are equal.
add t s is the concatenated key t/s. Raise Invalid_argument if s contains "/".
val segments : t -> string listsegments t is t's list of segments.
val basename : t -> stringbasename t is the last segment of t. basename empty is the empty string "".
parent t is the key without the last segment. parent empty is empty.
For any t, the invariant have parent t / basename t is t.
val to_string : t -> stringto_string t is the string representation of t. "/" is used as separator between segements and it always starts with "/".