Solving scheduling problems using parallel message-passing based constraint programming