ffi: implement more pointer accessors

Implement FF::Pointer put_bytes and get_string. Raise exception
when try to use null pointer.
ffi: raise TypeErrors on wrong type for type strategy writes
ffi: extend memory pointer

* Support passing block to initializer
* Add attr reader for total size of underlying data
* Support creating memory pointer without type (only size), needed for
  socket.rb
ffi: refactor FFI::Struct

* FFI::Struct now creates pointer to struct directly and does all opterators
  on this pointer (preparation for next change).
* Support to initialize FFI::Struct with given pointer
* Add FFI::Strcut.free to free data explicitly