Flesh out {do, has}{Read, Write} functions for individual endpoints.

These functions mirror the functionality of the generic* functions in the
haskell engine, serving to manage the interaction between handle, buffer and
subscribers.
Remove unnecessary generic* methods from the Engine.