I came across an article on CodeOfDoom.com about why estimations are inaccurate. The article starts with the question - Who made the estimate? If it's the new guy, he hadn't a clue of the team's efficiency, the skeletons in the closet (flaws in the existing system), and the requirements. If it's the upper management, the estimates made are either based on a dissimilar project or to please a higher-up guy. If it's marketing, they are in the business of selling the client an estimate and that's what makes it worse - you can't change your estimate, based on what you learn the further down the path you go, because what was sold to the client was the original estimate!
Often, we spend time doing things we didn't originally estimate for, such as lack of documentation, inadequate hardware and things we normally tend to overlook. Then, there's something that can be described as an act of God - illnesses, family emergencies and stuff of the sort.
Having put all of the above aside, dealing with the problem involves padding estimates, keeping management informed about resource and information requirements, and limiting changes to the scope or time frame and avoiding unrealistic time frames.
Finally, what you can do to keep work moving at the intended pace is to follow a couple of simple scrum practices (daily sprints, daily standup meets) and dealing with difficult people.