use Class::Method::Modifiers instead of an attribute role

This uses method modifiers to create the lvalue attributes instead of an accessor generator role, making the code simpler.  It includes tests for use with sprintf, based on what @doherty reported in issue #1.