Another thing to keep in mind is that there's a distinction between a system having cyclic dependencies (I need A & B working because they communicate with each other), and the task ordering. During development you can end up with a partially correct system. If A sends to B, and B sends to A but I only have one person working on both parts, then it's possible I'll end up in a state where A sends to B but not the reverse. That's fine during development. Yes, the system is "wrong" per the design or spec. But it's a partial system (like a half-built bridge). Your tasks will appear to have a cycle, but in reality you will break it by selecting one portion to complete first so in the end it remains (based on the chosen path) a DAG.
That produces subtasks without cycles, giving you a way forward.
Assuming you still want to maintain shared information about the tasks which contain subtasks, those tasks still have a dependency cycle between them though, which is correct because tasks are often like that - they need to move forward together.
And that's why I'm asking for a tool that lets me model projects as Directed Acyclic Graphs of tasks. Because all I seem to be getting in popular tools is a flat list with some categorizing, or a single level of subtasks at best. I want to be able to express directly that this subtask has sub-subtasks, and that this sub-subtask depends on completion of a subtask from some other task (without making it a dependency between root tasks).
Real dependencies can be not-before rather than strictly-after, which admits cycles without any problems with the flow of time.