
Few rules about ctypes keepalives:

* Ownership: the memory is freed when owner of this memory is deleted.
  Owner is the one who allocated the memory. So if we have:

  a = c_int(3)
  b = c_int.from_address(a._buffer.buffer) # pypy notion of address access

  only a frees memory.

* _objects: each ctypes object has (eventually) _objects dictionary in which
  it simply keeps objects to be kept alive.

* there are (some) rules about when to put stuff in it's objects when
  accessing the fields etc. need to list them here.

  * each object has _objects dictionary. In this dict stuff is stored per
    key, which should be a tuple of indices of storages.

places storing stuff in _objects:

* array item assignement, if we share the storage

* pointer item assignement, if we share the storage

* getitem on CDLL stores function pointer

* CFuncPtr.__new__ (assuming that it's a ctypes callable), stores itself
  (XXX???)

* set contents on pointer

* set value on primitive or __init__ on primitive
