Add a first cut at a KeyReducer class.

If Promise is for synchronizing over scalar values ($) and Channel is
for synchronizing over ordered values (@), this is for synchronizing
over keyed values (%).