What is a #delay inside a synchronous process used for?
This type of delay is called as transport delay. While using non blocking assignment, in sequential circuit, this type of delay is generally used for modelling delay between clock and output. 

Whenever input changes, output is immediately evaluated and kept in a event queue and assigned to output after specified "transport" delay.

Of course, any type of delay is not synthesizable.

For example, lets say the following statement executes at 5ns timestamp.

always @(a,b)
  s &lt;= #2 a+b;


The value of a+b is evaluated and stored internally in the simulators event queue, at 5ns. But the value is not assigned till 7ns. If any of the variables a or b changes in the gap of 2ns, then again the always block will be triggered. And another value shall be pushed into event queue.

For detailed information, CummingsHDLCON1999_BehavioralDelays paper is good to read. Also, the slides at Slideshare gives delay information.