Make io_buffer_t::out_buffer a raw pointer, initialize in io_buffer_t's constructor
Add missing virtual qualifier to ~io_buffer_t
Make is_input a member of io_pipe_t
Remove unneeded trailing semicolon of CAST_INIT
Remove unneeded io_data_t::print definition body
Make io_data_t::io_mode const

A protected constructor is needed in io_pipe_t to let io_buffer_t override
its io_mode.
In exec(), initialize input_redirect to 0
When constructing io_file_t, strdup the filename