@Floating Point: What I meant regarding "target" is that if you're not targeting all the voices (target 0), you're more or less responsible for voice allocation since you have to know which voice is going to get the value, which you should probably let poly~ handle. This is totally fine for voices that are on all the time; if I'm building a vocoder in poly~, for instance, I'll use target to pass the frequencies to the individual voices.
On the other hand, it doesn't work nearly as well for a synth or granular sampler because you're reusing voices with different values. If voice 1's ADSR envelope is 1., 150., 0.5, 200 and voice 2's ADSR envelope is 10000.,10000., 0.2, 5000. you're going to get completely different results depending on which voice gets the note from poly~. If you send the ADSR information with the note, however (what I term the "big list" strategy), it doesn't matter, since the voice will always have the appropriate envelope that goes with the note. Since you're getting parameters at a note boundary, you are also less likely to need interpolation for volume, etc. and you can know the order which things will arrive in and these are very good things. I always try to think about "do I need to know who's playing this?" when designing a poly~ patch. Usually if it has note-like events the answer is no.
Also, if you are using target 0, you could also use send/receive just as easily (if not more so). Target 0 makes sense if you're trying to limit the scope, or could be running multiple instances of the same voice patch within different poly~ objects. I tend to prefer send and receive because I always know that the message is going to all of the copies--it's helpful for students because it's one less thing to forget, and they can always double-click the send/receive to see where it's going. I also generally avoid having more than one "in" to my poly voice patch, unless I'm just distributing data to static voices, and use route.
There is one little problem with the "big list" strategy having to do with the midinote message. It's a pain to make sure that parameters don't change between the attack of the note and the release. (especially if you're randomizing/scaling things based on velocity, etc.) You definitely don't want to change the ADSR sustain value when releasing the note, for instance, since that sudden change will cause a click.
Here's an abstraction (PM.PolyList) that I use within voices that are being addressed with the "midinote" message. (which tells poly~ "handle voice allocation using note-ons and note-offs")
It passes pitch and velocity out the two left outlets for note-ons and note-offs; all the extra data is only passed on note-ons.
This is certainly not the only way to solve these problems with polyphony, but it's been reliable for me and has meant that I can use poly~ more than I might have otherwise. Anyway, that's probably enough pontificating for one night...