Variant: refactor of the shared field api

* shared fields api now behaves like the individual fields api (creates an object but doesn't make any copies)
* SharedField class is iterable and can hold multiple values
* special cased boolean_shared_field to return a single bool (since * vector<bool> is impossible by spec)
* current API (as well as the individual field API) relies on missing() checks before using the values. Dereferencing a missing shared field will segafult -- see #166
* add check for dereferencing an empty field (throws out of range exception instead of segfault)

fixes #151
operator>() is incorrect, since it doesn't actually ensure that m_body == other.m_body. If m_body != other.m_body, but m_current_data_ptr happens to be > other.m_current_data_ptr, it will return true, when in fact the iterators point to different records. 

It's also unnecessarily inefficient, since it calls both operator!=() (which calls operator==()) as well as operator<(). Should just do:

return m_body == other.m_body && m_current_data_ptr > other.m_current_data_ptr;