Enforce estimate time limit internally, rather than with set_time_limit

Also improve exceptions thrown to allow tracking partial estimate data