I've just checked in a rewrite of the watchlist function; instead of doing a zillion separate database queries, it now does just two: one to get the watchlist from the user table, the other to grab the info needed to fill out the table/list.
Please, check over it and make sure it looks okay before we let yet another horribly misshappen watchlist version wander over the land!
As a hack to get non-blank, non-talk namespaces listed until we have a separate field that contains the title but *not* the namespace, all valid namespaces get prepended to the titles-to-be-watched in the list given to the database to check against.
I've also fixed the bug whereby clicking "add to my watchlist" on a page with a non-blank namespace results in a redirect to the equivalent title in the blank namespace.
(It would also be possible, if preferred, to limit the namespace-laxity in the watchlist to just "X" and "X talk" pairs. Personally, I've seen enough pages get moved from blank to "wikipedia:" that I'd prefer to keep complete namespace agnosticism in my watchlist: the less I have to add and subtract things to keep my watchlist relevent, the better.)
-- brion vibber (brion @ pobox.com)