core: Enable notifications to be sent on set/unset

Change notify to handle unset by passing only the old value.
Introduce BuxtonList

BuxtonList provides an intelligent linked list. Unlike standard linked
list implementations, it tracks both head and tail, as well as its
own length. This allows for much faster append operations, enabling
the list to remain in its intended order.

A BuxtonList is not initially allocated, rather you use a pointer to
a BuxtonList pointer (double pointer) to initialise. It can be initialised
by appending to a NULL double-pointer. Given that append is just as
fast as prepend, either operation can be used without sacrifice.

BuxtonList also supports automatic freeing of members, which can be done
simply by using the buxton_list_free_all function, or one of the
shorthand attribute definitions (such as _cleanup_list_all)

Signed-off-by: Michael Ikey Doherty <michael.i.doherty@intel.com>
test/check_shared_lib: Add BuxtonList test suite (extensive)

This test is purposefully designed to test both the correctness
and performance of BuxtonList, resulting in 1 million elements
being added to a BuxtonList.

Signed-off-by: Michael Ikey Doherty <michael.i.doherty@intel.com>
core: Convert notification lists to BuxtonList

BuxtonList provides a managed solution to quickly and easily store
clients registered for notifications in the order they registered.
The previous map implemenation proved to be buggy, and broke
client notification support.

With this commit, one can observe that they can open as many
bxt_gtk_client instances as they can, and notifications will be sent
to all of the clients instantly.

Signed-off-by: Michael Ikey Doherty <michael.i.doherty@intel.com>