I suggest you JIRA. It has a downloadable, self-hosting version and available as an online service. Both are web-based.
Able to create projects or some way to strongly group tasks
It supports multiple projects, you can define components inside projects (every issue can belong to zero or more components), you can also tag issues and create a special issue type (called epic) and group issues by them.
Able to add tasks with due dates
It's supported. You can set your own custom fields too.
Able to assign tasks to a person
It's supported. Every issue has an Assignee field.
Able to write comments to a task
It's supported. You can also mention any JIRA user with @FirstName LastName in the comment and the mentioned user automatically gets an email notification.
Able to mark task status (open, in progress, closed, etc)
It's supported. You can define your own statuses and you are able to create custom workflows.
Able to view tasks by project or view all tasks across projects
It's supported. You can search for issues by any criteria. It supports a basic, user-friendly search form as well as an SQL-like query language (called JQL).
Able to view tasks by person assigned
It's supported. You can search for it but the Issues Summary for a Project screen is also very useful.
Able to send notifications when tasks are added or changed or comments are made (email preferred, but in app is okay)
JIRA sends emails when the status is changed (including new or modified comments) to every related person (reporter, assignee). Furthermore, anyone can watch any issue. Watchers get notification emails also on issue state changes. Users with proper permissions can add (or remove) anyone to the watcher list but usually anyone can watch any issue if they're interested.
It's possible to set up project and JIRA level notifications, so a project manager can get notifications from every (or just a specific type of) issue changes.
JIRA has activity streams which can show the recent activity in your JIRA instance or in the selected project, so you can easily see what's happened today or in the last few days, which issues has been solved, commented etc.
Every issue in JIRA has a priority field by default. (It's not too useful alone.)
With the JIRA Agile plugin you can create a sorted list of your issues (called backlog). (You don't have to use Scrum as a project management framework for that.)
Add and report on hours
It's supported. You can log time to every issue (except issues with closed state, but you can change that).
Able to easily change due dates on a task by dragging on a calendar
JIRA has a Calendar plugin (maybe more than one) but I've never used that.
Able to see tasks in a calendar view
As far I see it's supported by the Calendar Plugin above.
Able to some how determine if a task due date is feasible based on estimated hours and the number of hours the assigned person works per day.
I've no experience with this. (We are using the agile board/backlog and planning work/releases by story points.)
The main feature we are looking for is to be able to view all tasks that need to be done regardless of project. Because we work on several projects at once we need some way to prioritize tasks globally.
The Agile Plugin supports that, what you need is an Agile Board with a proper search query (filter) which searches in all of the related projects. It works quiet well for us.