Performance optimizations based on cachegrind/eep output

Using erlang:port_command more often instead of gen_tcp:send
Building binary by hand instead of iolist_to_binary
Using groc:send instead of gen_fsm:cast
Using lists:append instead of adding [Elem] to a list
Populating workers only if strict_round_robin strategy
Changed order of gaurd clauses with optimistic cases first
Avoided use of length, and comparing with [] instead
Brought back spawn for spawn_async_as_batch