attribute: clean up value initialisation

Currently, the presence of the 'value' key in a kwargs dict
indicates the presence of a value passed to the constructor, but the
kwargs are not used for anything else and I found this quite
confusing.

Use a tuple instead of kwargs, empty when there is no value and just
the value when there is (like Maybe/Option type).  I think this is
much clearer and the code is simpler as well.