A few miscellaneous tweaks.
Add serialization overloads for std::map.
Include optional semantics into the value class.

Up to this point, a value could either be "invalid", "nil", or one of the
existing value types. These semantics have now been changed as follows: a value
is either invalid or typed. If it is typed, it can have two states, similar to
std::optional: when it is engaged, one can access the underlying type via
get<T>. A disengaged value has a type, but does not describe an accesible
value. In a sense, a disengaged value is a disengaged optional<T> with T being
the underlying value type.

This commit also removes sets and vectors from the list of containers. We do
not really need them and can express these constraints implicitly via STL
algorithms that operate on a std::vector<value>. Besides, the code needed
refactoring anyway.