This looks like a fun challenge and sounds like you might have some other issues at play. I'm guessing that you are running client task deployments for more than 245 systems at a time? You shouldn't ever have to do that; instead, you may want to consider tag-based deployments (which can be automated).
Let's see how we can help answer your questions:
1. A notification if tasks are stuck in a Waiting status. During our issues, there were so many tasks firing off that some tasks had a status of "Waiting". I would like to create a notification somehow, whether it is a single task, multiple tasks, or for an extended period of time, if a task has this status.
So you will want to create a table-based query for this, and then use that query with a server task.
2. A notification if a number of tasks fail within a given period of time. Perhaps if 10 tasks fail within an hour, a notification could fire off.
There is not a native solution for this type of request since this isn't something that most organizations will do. I have an inelegant idea for a work-around, but I'm not sure it's the best way to handle this situation. Also, non-native solutions are not supported, so please keep that in mind. Could you help me understand what the goal is here? Otherwise, the recommended solution (and the best) is to monitor your dashboard for this activity. Then you can take action as you see these types of issues come up.
3. A notification if a task is in a status of "In Progress" for a set number of time. Perhaps if a task runs more than 2 hours, I get a notification, so that I am aware
This is same answer as #1. You can use a table-based query, and then a server task for the notification piece. Here's what I could think of for how to configure the query to find the type of task you're looking for.
Keep in mind, I haven't tested these solutions, so be sure to do your own testing. I hope it will at least give you a good idea about how to accomplish what you're trying to do. Let us know how things turn out!