Typically, the goal of a registration form to onboard the user with as little friction as possible. If you don't provide helpful error messages (like telling the user that their email address is already registered), then you're adding more friction to the process.
The cons of being more oblique in this case ("security through obscurity", as Jon W mentioned) far outweigh the pros. As Ben suggested, it's unlikely that most email harvesting scripts will use this method to hunt for valid email addresses. On the cons side, it introduces a significant barrier for your users -- a user can't fix an error that they don't understand.
One approach that I've seen recently is an attempt to assist users beyond simply providing an error. For instance, if I attempt to create an account on Facebook with an email address that is already registered, Facebook prompts me to recover my old account instead:
Sidenote: if your registration and/or login system allows for infinite failures without penalty, you're doing it wrong -- instead your system should institute a block or require a CAPTCHA for some period of time after some number of failures OR if the failure rate is too fast to be from a human user. One example of this in practice is signing in to your Google account -- after a few failed login attempts, it adds a CAPTCHA requirement.