refactored link label handling
refactored observation collections

this is more readable and also more flexible (e.g. `is_metadata?`)

retaining hash-like accessor for convenience and backwards compatibility
moved models to separate file
changed observations attributes to be lists rather than unary values

since we're dealing with graph data, there might be multiple values for
each attribute (note that we're actually using sets, so duplicates are
dropped)

of course this makes things a little more complex (as evidenced by the
required test modifications), but that's just something we'll have to
deal with