Extend GError to store extra data in the key-value store
Extra data can be used to store additional context of the failure.
This is a continuation of #14. This MR implements the extra data storage through datasets, instead of the RealError struct (like my latest patch in #14 did). This unfortunately adds a locking overhead everytime error is copied/freed, but I haven't seen any other way to add the feature without breaking ABI or crashing the code that was allocating GError on stack.