Refactored operations

Removed responsibility from Stream and created classes to handle each
of the operations seperately. Created a much cleaner test environment
and ensured that each class had only a very specific set of tasks to
handle.