I think this one is entirely on ATC for not being more decisive. Southwest knew FedEx was landing and vice versa, but neither knew exactly where the other was or what they were doing. ATC did and had the fullest picture but did not wave FedEx off or stop Southwest. When Southwest confirmed they were rolling, ATC should have told FedEx to climb and go around knowing that Southwest was still on the runway instead of watching FedEx try to land on Southwest. FedEx can tell Southwest to abort all day long, but if Southwest is past V1, then they can't without overshooting the runway. At this point, Southwest is probably trying to quickly decide if he actually can abort, and if he can, can they get out of the way before FedEx lands. Southwest probably didn't respond immediately because the pilots were going through the takeoff procedures and their focus was on aviating, not communicating, and they were trying to decide exactly what to do. When ATC tells him to go right and he says, "Negative," he's come to the realization that he has no other choice than to take off and has committed.
IMO, if FedEx needed Southwest to abort, FedEx should have just aborted the landing and gone around. It's a lot easier and safer to keep flying than it is to abort a takeoff. As soon as Southwest hesitated to confirm or deny an abort, they should have aborted themselves. ATC should have made the call on who was doing what much earlier. With the low visibility, they should have either told Southwest to hold short of the runway or told FedEx to go around because Southwest was lined up on the runway and would have presented a hazard.