OFStream: Use a delegate for async operations

The target / selector approach had several drawbacks:

 * It was inconvenient to use, as for every read or write, a target,
   selector and context would need to be specified.
 * It lacked any kind of type-safety and would not even warn about using
   a callback method with the wrong number of parameters.
 * It encouraged using a different callback method for each read or
   write call, which results in code that is hard to follow and also
   slower (as it needs to recreate the async operation with a new
   callback every time).