Why not make Bytes a rope? move the isCompact and compact, ++ etc into Bytes and have ByteString override them with a more specific return type?