this version uses hlists
misc
lots of hackery to try to get pickling to work, but basically gave up
stuff