Unified storage patterns

- Now it is possible to store any value (even non-pointers) in any
  structure.
- This comes at the cost of each structure taking callbacks from the
  user managing copy of data to the structure.
- Initializing the structures are as a result perhaps a bit complicated,
  but they have the same pattern in all structures and once done, the
  user would be greatly relieved from small malloc/frees for data that
  could be stored in the structures by value.

Signed-off-by: Shahbaz Youssefi <ShabbyX@gmail.com>