Double-Ended Synthesis Planning with Goal-Constrained Bidirectional Search