basic arithmetic doesn't work

sofar = micros();
while(digitalRead(echpin) != LOW) { }; // do nothing
duration = micros()-sofar;

You just set sofar to equal micros and then you subtract it from micros. Isn't that kinda like a-a and aren't you always going to end up with zero?

Bear in mind that if you change nothing w.r.t. timer0, the resolution of micros() is 4us. That's 64 clock cycles. A lot can happen in 64 ticks, especially if echpin is LOW. If you're looking to get high resolution timing, better to use timer1 or 2 with no prescaler and then log TCNT before and after. That way you're counting 62.5ns ticks. Even a prescaler of 8 will give you half micro ticks and millimeter resolution. The default prescaler is 64 and a bit granular for high-speed timing.

If none of that seems like it works, double check what values you're getting on your echo pin. If you want a low to kick in to stop/start the timing, do you have a pull-down resistor on the pin or does it just float? Floating inputs are not helpful if you want a valid reading to make a decision.