significantly simplified ghosts implementations: concrete ghosts are no longer subclasses of ghost and all interactions are done via protocols