Fully implement Storable instance for Attribute

Attribute is now used in place of HyperclientAttribute in the internal API.
AttributeList is instead used in arguments and return values, and that type
stores information on which side, Haskell or HyperDex, allocated it, the
number of items, a Haskell representation, and a pointer to a C array of
hyperclient_attribute structs.

This combined representation will be hidden by end-users, who will only
interact with the Attribute type.

As well, the internal Util.hs file contains functions on using ByteStrings as
CStrings, mirroring Foreign.C.String. ByteStrings are here used as they will
be targeted by HyperData.hs to serialize and deserialize the data types used
by HyperDex. Currently the Attribute type uses ByteString for its value
parameter, this will be resolved when the serialization implementation is more
complete.