Trap user tasks as requirements. To estimate, discuss the range of possible solutions, then give a rough estimate on the most likely solution. Plan your project around those estimates, and consider keeping notes regarding the range of solutions with your estimates as a reference. Resolve detail design when development time draws near—by then you should have good information about other features, time constraints, and development capacity.
Leave room to rescale. Although being alert to appropriate scale is important, slicing feature scale too thin and too early leaves little room for rescaling in the future. If you postpone choosing detail design solutions for user tasks until later, keep your initial estimates on the high side of moderate. This will allow you flexibility to raise and lower scale as time allows, based on user and task priority.
The next time you feel cornered and compelled to drop a feature from scope in order to reach a delivery, go back to the users, goals, and problems that motivated the particular solution in scope. Look at other alternatives that might allow you to still solve the problems at a lower cost. Rescale the feature, don't de-scope it.