"Should a test case contain enough detail for any guy off the street to execute the test?"
I think you should go for the test case level which is good enough for the test executers to be able to do their job. If you discover some cases which are not deatiled enough - add some more details.
More detail => More maintainance work when system changes, more work when you want to use the test cases for another project.
Less detail => test cases will not be executed exactly the same way each timne (for example differet test data might be used). So you might not be able to reproduce a problem found by the test case just by re-runing it once.
A real life story about this (since I have one - not sure if it adds anything useful): In my previous job (testing mobile phone SW) we had test cases which were not detailed. This was OK when the test case writers were also the test executers and had experience and knowlegde about the SW. Then test execution was moved to another team (in another country), which didnot have the same knowlegde and experience. After this move the test cases (of course) needed to be much more detailed and all the things not mentioned because they were common knowlegde had to be added.
This test case update happened by reacting on feedback from test executers. First time the executer met a problem they got support and next the test case was updated with the information needed. This "add details as needed" approach worked rather well :-)