Add exit code field/serialization
Report task exit codes
Remove assignment encapsulation
Handle failed tasks and permanent failures
Update task remaining calculation

Now accounts for permanent failures
Remove unneeded main method
Use logger instead of stdout
Reformat task failure message
Add failed task list management
Defer writer creation
Add shutdown() method to close writers
Log task failures