Split payment models into abstract and concrete versions
Hattip to @BuddhaOhneHals for doing this in the first place.
Unfortunately, I couldn't (be bothered to) merge the original commit as
the merge conflicts were too painful to resolve - simpler to just
reapply the same change myself.
Fixes #466