Just a quick note to report success in this area. I hope to post more complete instructions (including modifications to support locations and resources), but for now I want to alert readers to a major sticking point I ran into, in case anyone else is trying this.
In zimtood, one of the variables you need to configure is
$od_base = 'cn=people,dc=example,dc=org'
I was setting this to 'cn=people,dc=zimbra,dc=company,dc=com'. (The dc attributes are just by way of example.)
The problem is that as far as I can tell, iCal lookups (for autocompletion as well as searches in the Address Panel) are performed on the base cn=users,dc=zimbra,dc=company,dc=com.
So once I changed the line to
$od_base = 'cn=users,dc=zimbra,dc=company,dc=com' and reran zimtood, things started working.
My copy of Address Book was now seeing double on its lookups via Directory Services, though. I suspect this is because Address Book uses both cn=people and cn=users in its searches.
Going back and manually deleting the previously-created objects under the cn=people branch fixed this.
Apache Directory Studio was very useful in this whole process, even though I've started to get the hang of the command-line ldap commands.
EDIT: I gather the reason for the "people" branch in OD, and why Address Book searches it while iCal doesn't, is that "people" is for folks outside of your organization--or at least, people whom you don't want to have show up in your iCal autocompletion. One nice thing about the way Sean wrote zimtood is that it only replaces objects in the branch specified by $od_base. So if you do add objects under "people", zimtood won't mess with them once you use cn=users in $od_base.