Added given lab4 code
Copied .gitignore from lab3
Untracked some autogenerated files
Added test cases for synchronous message passing

One test runs the receiver then the sender, and the other runs the sender then the receiver. Both tests sleep and make sure the first process is blocked before running the second process.
Controlled sender and receiver with semaphores, added assert

Replaced some sleeps with semaphores
Replaced print statements with assert
Copied system calls receive and send to receiveb and sendb

Added PR_SND process state
Added system/receiveb.c and system/sendb.c to system/Makerules
Reformatted test output to hide passing tests
Added some assertions and comments

Removed an unnecessary sleep
Fixed typo from PR_SEND to PR_SND
Added test with multiple senders and a single receiver
Modified the tests so that the first send is non-blocking
Added field in process table entry for an outgoing message
Ignored autogenerated lex and yacc files
Implemented the send queue

Also removed some asserts which didn't make sense in this implementation
Fixed sender logic

Now sendb will not return an error if the receiver already has a message.
Reverted back to default message passing implementation

The use of semaphores for the sender queue is not allowed. PR_SND, sndmsg, and sndflag must be defined and used.

This reverts commits:
ac02926a6de488e2ef6c0e779bd59a626c766926
99a4a8c4df32dce407246805bcb2eddb62fc759f
Removed completed TODO for test_multiple_senders
Implemented blocking sending of messages without semaphores

Sending a message to a process which already has a messages puts the sender in the PR_SND state, moves the sender process to the receiver's senders queue, and calls resched.
Receiving a message dequeues the next sender and sets its state to PR_READY if it exists.
Removed unused sndmsg and sndflag
Added README listing features implemented