Ian - excellent initial effort... I am willing to spend a bit of time testing for you.
There will be a number of HTML and css issues as you refine the code, but may I suggest you run each of your pages through a validator and fix the errors it reports?
Here are a few comments based on your documentation:
* Be shure to copy ./img folder and all the .tpl files to your template/default directory!!!
* Do the same with the file style_eventcal_backend.css!!!
User should not have to do this. Other plugins have tpl files, images, etc... Users should not have to manually copy tpls from the plugin to anywhere. They should be fetched first from the current template folder, and if they do not exist, then from the plugin itself. Additionally, your plugin includes two images whose filenames already exist in /templates/default/img/: delete.png and blank.png. The delete images are not the same. In fact, I'll bet s9y already has icons in templates/default/admin/img/ that would be suitable so you would not need to ship the plugin with any icons, unless you prefer your graphically over s9y's icon pack.
* Copy the file: modifier.close_tags.php to s9y/bundled-libs/Smarty/libs/plugins!! - This modifier is used, when a qualified serendipity user changes or writes an event with BBCode in the long description field. This will do noisy html when we use the modifier truncate in the app table for unapproved events only.
I'm not entirely sure what this is, but again, I am not comfortable with a plugin asking a user to place a file in a core folder. Why is this plugin trying to handle BBCode in a description field?
* Install and see if table eventcal is installed. If not, do it manually (see bottom line and do not forget to change the prefix to your usual ones).
I tried it on two different test servers. The table was not created in either one. One attempt was installed via spartacus, the other was installed by downloading the zip file and extracting. I think this needs to be fixed as not all users have access to phpMyAdmin through their hosting providers and will be unable to follow your instructions for manually creating the table.
* Fill in event values. You can choose between single days, muli-days, recuring events (monthly or weekly).
I was unable to create any event entries - clicking "Insert entries" takes me back to my front page.
* IMHO there is no need for Capchas, while these bots are stupid. if that ever changes, tell me.
Consider yourself told.

I People & bots will abuse something like this every chance they get. Incorporating captchas into a form should be easily achieved through one of the other examples... maybe the contact form or suggest entry plugin would be a good place to look.
A few other quick observations:
The permalink path did not detect URL rewriting as off or on... nor did it detect the serendipity install folder... for instance, one of my sandboxes deliberately does NOT use URL rewriting, and exists in a folder called "sandbox". The plugin defaulted the permalink to "pages/eventcal.html" when it should have defaulted to "sandbox/index.php?/pages/eventcal.html". I'm sure there is a simple variable holding the rewrite path, just as there is in smarty ({$serendipityRewritePrefix}), I just do not know what it is.
I see you emitting the table at a specified width, but then override that width with css. I do not think you should be emitting a width of anything other than 100%. Again, I did not spend much time examining the html and css due to the numerous validator errors. Besides, way too early for that kind of fine tuning.
That is all I have for now. Keep up the great work!