Further map lift, making it fully generic (should be in make-record-type).