I wouldn't mind seeing a more in-depth form of prioritization where you have primary, secondary, and tertiary jobs. Multiple jobs allowed per class, but secondary and tertiary have a delay before starting work (so your guys wait around a little for a primary job to show up again).
You could set farming (fields) and farming (workshop) as primary jobs, so your farmer takes a farming job if it's available, then a workshop job if it's available, right away.
Then set hauling as a secondary job, so if there's no farming jobs open for three seconds, you go haul instead.
Finally, set masonry as a tertiary job: If there's not even any hauling jobs for ten seconds, your farmer can still go and make himself busy.
The reason for the delays is this: Let's say you have Urist (an excellent mason, and middling carpenter, who prefers those jobs in order) and Unib (an excellent carpenter and middling mason, who prefers those jobs in order). If Urist is taking a nap and some other dwarf is currently on the carpentry bench, Unib is going to go grab a masonry job. Then when Urist wakes up, she might find only the carpentry bench available. Without a delay after task completion, Urist and Unib may never notice that their preferred jobs are actually available, and will keep doing each others' work.
A delay wouldn't totally eliminate that behavior, but it makes it more likely that Urist will take her mason's bench back: Unib doesn't -really- like masonry that much, so he leaves it open for a little while after he's done with each job.