Modified boundary of respsonsibiliy for plugins to fully support semantics. Plugins now take keys and return a dict of keys and attributes for those keys. Sources can ignore the keys, and appenders can add attributes to the keys. But plugins don't take data and modify it, just keys. Runner is solely responsible for merging data from each plugin call into data and passing the new set of keys to the next call