Abstract Watch/Unwatch into a separate type

Signed-off-by: Jonathan Rudenberg <jonathan@titanous.com>